3

问题

我有一个包含位图图像的 32 位像素数据数组。

TPixel = packed record
  B: Byte;
  G: Byte;
  R: Byte;
  A: Byte;
end;

Size = MyBitmapWidth * MyBitmapHeight;

MyBitmapData : array[0..Size-1] of TPixel;

是否可以创建一个新的 TCanvas 对象并将其附加到我现有的像素数据中?画布对象还需要分配一个句柄。

背景

我正在使用创建位图数据的第三方库(作为 32 位像素数组)。我想在另一个以 TCanvas.Handle 作为参数的函数中使用相同的像素数据。

4

1 回答 1

1

根据数组中数据的方向,您可能需要通过以下方式更改方向: pscanLine32[j].rgbReserved := Arr[i * Width + Height - j].A;

type
  TPixel = packed record
    B: Byte;
    G: Byte;
    R: Byte;
    A: Byte;
  end;

  TMyBitmapData = array of TPixel;

type
  pRGBQuadArray = ^TRGBQuadArray;
  TRGBQuadArray = ARRAY [0 .. $EFFFFFF] OF TRGBQuad;

Procedure FillBitMap(var bmp: TBitMap; Arr: TMyBitmapData; Width, Height: Integer);
var
  pscanLine32: pRGBQuadArray;
  i, j: Integer;
begin
  if not Assigned(bmp) then
    bmp := TBitMap.Create;
  bmp.PixelFormat := pf32Bit;
  bmp.ignorepalette := true;
  bmp.Width := Width;
  bmp.Height := Height;
  for i := 0 to bmp.Height - 1 do
  begin
    pscanLine32 := bmp.Scanline[i];
    for j := 0 to bmp.Width - 1 do
    begin
      pscanLine32[j].rgbReserved := Arr[i * Width + j].A;
      pscanLine32[j].rgbBlue := Arr[i * Width + j].B;
      pscanLine32[j].rgbRed := Arr[i * Width + j].R;
      pscanLine32[j].rgbGreen := Arr[i * Width + j].G;
    end;
  end;
end;

procedure TForm4.Button1Click(Sender: TObject);
var
  MyBitmapWidth: Integer;
  MyBitmapHeight: Integer;
  Size: Cardinal;
  MyBitmapData: TMyBitmapData;
  bmp: TBitMap;
  x: Integer;
begin
  MyBitmapWidth := 100;
  MyBitmapHeight := 100;
  Size := MyBitmapWidth * MyBitmapHeight;
  SetLength(MyBitmapData, Size );

  for x := 0 to MyBitmapWidth - 1 do
  begin
    MyBitmapData[x * MyBitmapWidth + x].A := 255;
    MyBitmapData[x * MyBitmapWidth + x].R := 255;
  end;


  bmp := TBitMap.Create;
  try
    FillBitMap(bmp, MyBitmapData, MyBitmapWidth,MyBitmapHeight );
    Image1.picture.Assign(bmp);
  finally
    bmp.Free;
  end;

end;
于 2012-12-21T15:37:03.503 回答