gpt4 book ai didi

delphi - 从原始像素数据数组加载 TPicture

转载 作者:行者123 更新时间:2023-12-03 15:49:24 27 4
gpt4 key购买 nike

我对 delphi 完全陌生,我有一个项目,需要将图片从指针加载到保存原始像素数据的 C 数组。

我不能简单地使用TPicture.LoadFromFile,因为实际加载是在 C++ DLL 中执行的。我从 DLL 返回的只是一个指向图像宽度、高度、格式的指针以及指向保存像素数据的数组的指针。

DLL_Image = packed record
Width : UInt32; { Width of image. [px] }
Height : UInt32; { Height of image. [px] }
Format : ImageFormat; { (Color) Format of image. }
Data : ^UInt8; { Points to image data. }
end;
DLL_PImage = ^DLL_Image;

我尝试的是将图像数据加载到 TMemoryStream 中,然后加载 TPicture.LoadFromStream() ,但这不起作用。 IIRC 我必须将 TPicture 的正确实例写入流才能完成这项工作。

有没有办法从数据数组加载图像?

最佳答案

通过将像素数据复制到 TBitmap 的扫描线,您可以使用给定的像素数据轻松创建 VCL TBitmap 对象。

这是一个简单的例子。

首先我们创建一些示例原始像素数据:

function MakePixelData(const AWidth, AHeight: Integer): pointer;
var
p: PRGBQuad;
y, x: Integer;
begin
GetMem(Result, AWidth * AHeight * sizeof(TRGBQuad));
p := PRGBQuad(Result);
y := 0;
while y < AHeight do
begin
x := 0;
while x < AWidth do
begin
p.rgbRed := 255 * x div AWidth;
p.rgbGreen := 255 * y div AHeight;
p.rgbBlue := 255;
Inc(x);
Inc(p);
end;
Inc(y);
end;
end;

procedure FreePixelData(var AData: pointer);
begin
FreeMem(AData);
end;

MakePixelData 函数在堆上为给定大小的位图分配一些内存,并用简单的渐变填充它:

Sample bitmap with a simple gradient

然后使用 FreePixelData 过程释放该内存。

现在到了有趣的部分,使用这个原始像素数据来获取 VCL TBitmap 对象:

procedure TForm1.FormCreate(Sender: TObject);
const
W = 400;
H = 200;
var
RawPixelData: pointer;
bm: TBitmap;
y: Integer;

function PixelData(ARowIndex: Integer): pointer;
begin
Result := PByte(RawPixelData) + ARowIndex * W * sizeof(TRGBQuad);
end;

begin

RawPixelData := MakePixelData(W, H);
try

bm := TBitmap.Create;
try
bm.SetSize(W, H);
bm.PixelFormat := pf32bit;
for y := 0 to bm.Height - 1 do
CopyMemory(bm.ScanLine[y], PixelData(y), bm.Width * sizeof(TRGBQuad));
bm.SaveToFile('D:\Desktop\Bitmap from raw pixel data.bmp');
finally
bm.Free;
end;

finally
FreePixelData(RawPixelData);
end;

end;

这将从原始像素数据创建一个 VCL TBitmap。只是为了证明它有效,我将其保存为文件。但您也可以将其显示在 TImage 控件中或将其用于某些自定义 VCL 绘图。

请注意各处使用相同的像素格式。在我的示例中,我使用 32 位 RGBX 数据。

关于delphi - 从原始像素数据数组加载 TPicture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57726522/

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