【发布时间】:2016-09-30 09:28:44
【问题描述】:
我收到来自第三方组件的 PBitmap,它是指向 Windows.tagBitmap 记录的指针。
{ Bitmap Header Definition }
PBitmap = ^TBitmap;
{$EXTERNALSYM tagBITMAP}
tagBITMAP = record
bmType: Longint;
bmWidth: Longint;
bmHeight: Longint;
bmWidthBytes: Longint;
bmPlanes: Word;
bmBitsPixel: Word;
bmBits: Pointer;
end;
TBitmap = tagBITMAP;
{$EXTERNALSYM TBitmap}
BITMAP = tagBITMAP;
{$EXTERNALSYM BITMAP}
我想将此指针中包含的数据转换为常规DIB 并将此数据保存到流中。就像Graphics.TBitmap.SaveToStream 一样。
所以最好我想有一个像这样的程序:
procedure SavetagBitmapAsDIBToStream(const ABitmap: PBitmap; var AStream: TStream);
我试图在MSDN 上找到有关此结构的信息,但那里描述的标题(BITMAPFILEHEADER、BITMAPINFOHEADER 等)似乎都符合tagBITMAP。
有这方面经验的人可以帮助我吗?
已编辑: C\C++ 中的示例对我来说也可以。
【问题讨论】:
-
有关该结构的 Microsoft 文档可在此 MSDN 页面上找到:msdn.microsoft.com/en-us/library/dd183371(v=vs.85).aspx
-
您也可以使用 Win32 CreateBitmap 函数为该 tagBITMAP 数据创建 Windows GDI 句柄,然后将该句柄分配给
Vcl.Graphics.TBitmap.Handle并将 TBitmap 保存到文件/流/任何内容 -
我不明白这个问题。您已经有了
BITMAP结构的布局(tagBITMAP只是内部名称,早期 C 的产物,参见 Why do structures get tag names even if there is a typedef?)。另一方面,DIB 并没有什么特别之处。它只是具有某些功能的常规位图。那么你真正想在这里解决什么问题? -
那是位图,不一定是DIB。我还是不明白这个问题。
-
我还是不明白这个问题。听起来您是在询问您的解决方案,而不是您真正想要解决的问题(并在此过程中混淆了不相关的概念)。我建议您改为询问您的问题。
标签: delphi winapi bitmap delphi-xe5 dib