All pastes #18857 Raw Edit

deccer

public text v1 · immutable
#18857 ·published 2005-07-30 15:00 UTC
rendered paste body
type
  PRGBData = ^TRGBData;
  TRGBData = record
    R: byte;
    G: byte;
    B: byte;
  end;

  PRGBDataArray = ^TRGBDataArray;
  TRGBDataArray = array[0..MaxInt shr 3] of TRGBData;

var
  xBmp: TBitmap;
  iWidth: integer;
  iHeight: integer;
  iBpp: integer;
  pData: PRGBData;
  pRow: PRGBData;
  iRow: integer;
  iRowOffset: integer;
  pDest: PChar;
  pSource: PChar;

  procedure BGR24ToRGB24(Source, Dest: PChar; PixelCount: integer);
  begin
    while PixelCount > 0 do begin
      PChar(Dest)[0] := PChar(Source)[2];
      PChar(Dest)[1] := PChar(Source)[1];
      PChar(Dest)[2] := PChar(Source)[0];
      Dest := Pointer(Integer(Dest) + 3);
      Source := Pointer(Integer(Source) + 3);
      Dec(pixelCount);
    end;
  end;

begin
  xBmp := TBitmap.Create;
  xBmp.LoadFromFile('c:\blah256x256.bmp');
  iWidth := xBmp.Width;
  iHeight := xBmp.Height;
  iBpp := SizeOf(TRGBData); // 3

  GetMem(pData, iWidth * iHeight * iBpp);
  pDest := @PChar(pData)[(iWidth * iBpp * iHeight) - 1];
  pSource := xBmp.ScanLine[0];
  iRowOffset := Integer(xBmp.ScanLine[1]) - Integer(pSource);

  for iRow := 0 to xBmp.Height - 1 do begin
    BGR24ToRGB24(pSource, pDest, iWidth);
    Dec(pDest, iWidth * iBpp);
    Inc(pSource, iRowOffset);
  end;
  FreeAndNil(xBmp);
  FreeMem(pData);