0

Delphi 的 TBitmap 类型基本上是 GDI BITMAP 和 PALETTE 的包装器,并且可以支持自上而下和自下而上的扫描线排序。

我有一个 TBitmap,我需要将其转换为 GDI+ Bitmap,以便对其进行旋转和合成。

我的位图是 Windows 支持的 32 位 ARGB,但 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

这得到了阿尔法,但位图是颠倒的,所以我尝试了这个

Gdiplus::Bitmap b(bmp->Width,  bmp->Height, - bmp->Width *4, PixelFormat32bppARGB,   
    (BYTE*) bmp->ScanLine[0]);  // negative stride for bottom up bitmaps?!

现在,这行得通,但我当然是硬编码到自下而上的位图中。但是,我找不到确定 TBitmap 是自上而下还是自下而上的方法。它们以负高度存储在内部,但高度值在传递回用户代码之前会被处理。

我怎样才能找出扫描线的顺序,或者——更好的是——还有另一种从 TBitmap 创建 GDIPlus 位图的方法吗?

4

1 回答 1

3

TBitmap::ScanLine属性占自上而下和自下而上。对于自底向上位图,ScanLine[0]返回原始像素数据的最后一行,并ScanLine[Height-1]返回第一行。对于自上而下的位图,返回原始像素数据ScanLine[0]的第一行和最后一行。ScanLine[Height-1]

要确定 aTBitmap是自下而上还是自上而下,您必须手动检索其BITMAPINFOHEADER结构,该结构TBitmap本身并不公开。您可以使用 Win32 APIGetObject()函数来检索DIBSECTION具有BITMAPINFOHEADER成员的结构。

于 2013-01-17T01:38:29.223 回答