- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 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
函数在堆上为给定大小的位图分配一些内存,并用简单的渐变填充它:
然后使用 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/
我对 delphi 完全陌生,我有一个项目,需要将图片从指针加载到保存原始像素数据的 C 数组。 我不能简单地使用TPicture.LoadFromFile,因为实际加载是在 C++ DLL 中执行的
我正在遍历表单的控制列表,当我找到 TPicture 时,我想更改属性(图像,但任何示例都可以)。 我该如何编码? TPciture 和 TControl 似乎不兼容。我可以以某种方式转换吗? 更新:
如何从 TImageList 中获取 TPicture? 我需要做Image1.Picture:=...TPicture从图像列表中,将图像加载到 TImage 中。 图像列表存储我所有透明的 PNG
我在网上搜索了几个小时,但找不到任何有关如何从 TPicture.Graphic 获取调色板的信息。我还需要获取颜色值,以便可以将这些值传递到 TStringList 以填充颜色选择器中的单元格。 这
如何将已在 TWebBrowser 中下载的图像获取到 TPicture,而不将其复制到剪贴板或查找缓存内容。 最佳答案 好的,我用最后一个答案制作了样本: 首先使用此函数通过 Id 获取图像: fu
这是我的组件整体结构: 我的组件 属性类别:TCollection(TCategory 的) T类别 属性Icon: TPicture 读FIcon 写SetIcon; 属性示例:整数读取 FExam
我使用此代码将透明 png 转换为 32 bpp bmp。 var Picture : TPicture; BMP : TBitmap; begin Picture := TPi
使用 Delphi 7。我有一个简单的例程成功加载 .bmp , .emf , .wmf , .ico和 .jpg文件(下面给出的代码)。我的问题是每个 .ico (图标)文件总是报告 TImage.
我是一名优秀的程序员,十分优秀!