根據陣列中數據的方向,您可能需要改變方向,如: 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;
如果該函數使用TCanvas.Handle作爲它的參數,那麼你不需要* TCanvas。你需要的是一個'HDC' - 一個Windows設備上下文的句柄。 –
我一直在寫一個答案,解釋爲什麼它是不可能的,但現在我想它可能是。它需要能夠創建一個'HBitmap'來保存對像素緩衝區的引用,然後創建一個DC(使用'CreateCompatibleDC'),最後在DC中選擇位圖(使用'SelectObject')。我不確定的唯一部分是第一部分;我無法從文檔中知道「CreateDIBitmap」或「CreateDIBSection」是否保留對原始數據的引用。 ('TCanvas'與這個過程無關,但是如果你確實需要的話,只要在你準備好的時候分配'Handle:= hDC'。) –