Delphi的TBitmap类型基本上是GDI BITMAP和PALETTE的包装器,可以支持自上而下和自下而上的扫描线排序。
我有一个TBitmap,我需要将其转换为GDI + Bitmap,以便旋转和合成它。
我的位图是32位ARGB,Windows支持,但VCL本身并不“理解”。
TBitmap *bmp;
...
当我使用以下构造函数时,alpha通道不能用于合成,但其他方法都可以正常工作。
Gdiplus::Bitmap b(bmp->Handle, NULL);
所以,我尝试了下面的构造函数,它需要大小,像素数据和格式参数。
Gdiplus::Bitmap b(bmp->Width, bmp->Height, bmp->Width *4, PixelFormat32bppARGB,
(BYTE*) bmp->ScanLine[bmp->Height-1]); // bottom up storage
这会得到alpha,但是位图是颠倒的,所以我尝试了这个
Gdiplus::Bitmap b(bmp->Width, bmp->Height, - bmp->Width *4, PixelFormat32bppARGB,
(BYTE*) bmp->ScanLine[0]); // negative stride for bottom up bitmaps?!
现在,这有效,但当然我已经硬编码到自下而上的位图中。但是,我无法找到确定TBitmap是自上而下还是自下而上的方法。它们在内部存储负高度,但高度值在传回用户代码之前进行了按摩。
如何找到扫描线的顺序,或者 - 更好的是 - 是否有另一种从TBitmap创建GDIPlus位图的方法?
答案 0 :(得分:3)
TBitmap::ScanLine
属性自上而下和自下而上。对于自下而上的位图,ScanLine[0]
返回最后一行,ScanLine[Height-1]
返回原始像素数据的第一行。对于自上而下的位图,ScanLine[0]
返回第一行,ScanLine[Height-1]
返回原始像素数据的最后一行。
要确定TBitmap
是自下而上还是自上而下,您必须手动检索其BITMAPINFOHEADER
结构,TBitmap
本身不会公开。您可以使用Win32 API GetObject()
函数来检索DIBSECTION
结构,该结构具有BITMAPINFOHEADER
成员。