如果给出HBITMAP指针,我的应用程序是控制台应用程序,如何从hbitmap获取图像字节。 我尝试使用GetDIBits,它需要像HDC这样的参数,这是我无法得到的。
编辑: 我从文件中加载位图:
HBITMAP bm = 0;
BITMAP Bitmap;
bm = (HBITMAP)LoadImage (0, TEXT("C:\\img1.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
我将HBITMAP传递给函数,并希望得到另一个处理过的图像的HBITMAP:
HBITMAP out1 = func(bm);
func是:
HBITMAP func(HBITMAP im);
问题是如何从HBITMAP获取图像字节。
答案 0 :(得分:10)
最简单的方法是不来使用GetDIBits
(也不是GetBitmapBits
)。这些功能很糟糕,因为它们会复制数据
如果您想直接获取数据,只需使用(对于DDB位图)
BITMAP bitmap;
GetObject(hBitmap, sizeof(bitmap), (LPVoid)&bitmap);
对于DIB位图,请使用
DIBSECTION dib;
GetObject(hBitmap, sizeof(dib), (LPVOID)&dib);
GetObject信息,请参阅:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd144904%28v=vs.85%29.aspx
这不涉及任何数据复制,因此避免了与GetDIBits相关的复杂问题,请参阅:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd144879%28v=vs.85%29.aspx
ESP。底部的评论用于解释GetDIBits
的困难。
请注意,您不获取调色板信息,但由于大多数位图都是24位或32位,因此这在大多数情况下都不是问题。
答案 1 :(得分:1)
由于您使用LoadImage
来获取HBITMAP
,因此它确实是DIB(设备无关位图)(它们称之为DIB部分)。但是,您没有颜色信息。
This MSDN HOWTO向您展示如何在内存DC中选择DIB部分。然后他们继续使用GetDIBColorTable
来获取调色板。但是,我相信,通过该DC,您可以使用GetDIBits
来获取RGB位图信息。
以下是它的一般要点:
// Create a memory DC and select the DIBSection into it
hMemDC = CreateCompatibleDC( NULL );
(HBITMAP)SelectObject( hMemDC, hBitmap );
GetDIBits(hMemDC, hBitmap, ...);
您会在代码中注意SelectObject
返回DC中 的句柄。然后他们在调用DeleteDC
之前恢复它。我不确定它是完全必要的,但他们这样做。为了清楚起见,我把它留在了这里。
答案 2 :(得分:1)
对我们有用的是:调用GetDIBits
,同时仍然在设备上下文中选择正确的调色板(如果是索引颜色)。 (如果未选择调色板,颜色会出现乱码。)
但是在我们的使用案例中,事实证明DIB部分的表现要好得多,所以也要检查它们并进行基准测试。但是,有一些陷阱。 Windows不会使用调色板,我们必须在使用前调用SetDIBColorTable
。但是设备上下文仍然需要在设备上下文中选择并实现的一个条目(仅限黑色)虚拟调色板,否则Windows也会忽略SetDIBColorTable
设置的调色板。 <{1}}和SetDIBColorTable
都需要存在,否则颜色会出现乱码。
答案 3 :(得分:0)
自问题编辑后查看新答案...
如果没有设备上下文句柄(HDC
),则无法执行此操作。这是因为GetDIBits
期望HBITMAP
位图的句柄。这必须是兼容的位图(DDB)。
DDB是Device-Dependent Bitmap,(与DIB或设备无关的位图相对)。这意味着:
请注意,DDB不包含颜色值;相反,颜色是依赖于设备的格式。
这就是GetDIBits
需要HDC
的原因。否则无法获取颜色信息。
也许一个很好的问题是,如果没有伴随HBITMAP
,你会在哪里获得HDC
?
如果您尝试在内存中创建此位图,首先您可以调用CreateCompatibleDC
创建与某些设备兼容的内存中DC,然后使用该DC CreateCompatibleBitmap。然后,您可以随时使用HBITMAP
和HDC
。否则,如果您不知道HBITMAP
指向的是什么,您就不能期望对它做任何有用的事情。
答案 4 :(得分:0)
您甚至可以从控制台尝试GetBitmapBits API。更多信息: http://msdn.microsoft.com/en-us/library/windows/desktop/dd144850%28v=vs.85%29.aspx
只需传递HBITMAP句柄即可获得你的字节