gpt4 book ai didi

delphi - 如何从Bits数组创建Bitmap32?

转载 作者:行者123 更新时间:2023-12-03 18:29:59 45 4
gpt4 key购买 nike

我有一个函数,该函数返回一个指针,该指针指向将图像存储为Bitmap32.Bits的内存:

function FileToMemoryAsBitmap32Bits: pointer;
var
bmp32: TBitmap32;
wic: TWICImage;
begin
Result := nil;

bmp32 := TBitmap32.Create();
try
wic := TWICImage.Create;
try
wic.LoadFromFile('256x256.jpg');
bmp32.Assign(wic);
GetMem(Result, 256*256*4);
Move(bmp32.Bits^, Result^, 256*256*4);
finally
FreeAndNil(wic);
end;
finally
FreeAndNil(bmp32);
end;
end;


在代码的其他地方,我需要从内存中的这些位创建一个新的Bitmap32。如何正确做?
我尝试执行以下操作:

var 
p: Pointer;
NewBitmap32: TBitmap32;
// ...
p := FileToMemoryAsBitmap32Bits;
// ... do something with Bits in memory
NewBitmap32 := TBitmap32.Create(256, 256);
NewBitmap32.Bits := p;


但我得到一个错误:


E2129无法分配给只读属性


为@RudyVelthuis添加:

procedure RenderMemoryToBitmap32(Output: TBitmap32; p: pointer; const x, y: integer);
var
d, i,j: integer;
OutputRowRGBA, RowRGBA: PColor32Array;
begin
RowRGBA := PColor32Array(p);
for j := 0 to 255 do begin
OutputRowRGBA := Output.Scanline[y+j]; // row in large bitmap

for i := 0 to 255 do begin
d := i + x; // offset
TColor32Entry(OutputRowRGBA[d]).B := TColor32Entry(RowRGBA[i]).B;
TColor32Entry(OutputRowRGBA[d]).G := TColor32Entry(RowRGBA[i]).G;
TColor32Entry(OutputRowRGBA[d]).R := TColor32Entry(RowRGBA[i]).R;
TColor32Entry(OutputRowRGBA[d]).A := TColor32Entry(RowRGBA[i]).A;
end;

inc(longword(RowRGBA), 256*4); // next row
end;
end;

最佳答案

您无法使用这种方式更改数据地址,已经分配了内存,并且bitmap32不允许替换其地址。

但是您可以将存储的数据移到此位置,例如(但方向相反),您已经进行了存储,但是方向相反:

 Move(p^, NewBitmap32.Bits^,  256*256*4);

关于delphi - 如何从Bits数组创建Bitmap32?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54454283/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com