Delphi / C ++ Builder TBitmap:如何确定扫描线顺序?

时间:2013-01-16 21:26:25

标签: gdi+ gdi c++builder vcl

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位图的方法?

1 个答案:

答案 0 :(得分:3)

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

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