从HBITMAP获取字节

max*_*mus 4 winapi hbitmap

如果给出HBITMAP指针,我的应用程序是控制台应用程序,如何从hbitmap获取图像字节.我尝试使用GetDIBits,它需要像HDC这样的参数,这是我无法得到的.

编辑:我从文件加载位图:

HBITMAP bm = 0; 
BITMAP Bitmap;
bm = (HBITMAP)LoadImage (0, TEXT("C:\\img1.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
Run Code Online (Sandbox Code Playgroud)

我将HBITMAP传递给函数,并希望得到另一个处理过的图像的HBITMAP:

HBITMAP out1 = func(bm);
Run Code Online (Sandbox Code Playgroud)

其中func是:

HBITMAP func(HBITMAP im);
Run Code Online (Sandbox Code Playgroud)

问题是如何从HBITMAP获取图像字节.

Joh*_*ica 10

最简单的方法是使用GetDIBits(也不GetBitmapBits).这些功能很糟糕,因为它们会复制数据.
如果你想直接获得数据,只需使用(对于DDB位图)

BITMAP bitmap;
GetObject(hBitmap, sizeof(bitmap), (LPVoid)&bitmap);
Run Code Online (Sandbox Code Playgroud)

对于DIB位图使用

DIBSECTION dib;
GetObject(hBitmap, sizeof(dib), (LPVOID)&dib);
Run Code Online (Sandbox Code Playgroud)

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位,因此这在大多数情况下都不是问题.

  • 根据这个https://msdn.microsoft.com/en-us/library/dd144904(v=vs.85).aspx如果位图不是由`CreateDIBSection`创建的,则bitmap.bmBit`指针将为null. (4认同)

Jon*_*art 0

问题编辑后查看新答案...

如果没有设备上下文句柄 ( HDC),则无法执行此操作。这是因为GetDIBits期望一个HBITMAPwhich是

位图的句柄。这必须是兼容位图 (DDB)。

DDB 是设备相关位图(与 DIB 或设备无关位图相对)。这意味着:

请注意,DDB 不包含颜色值;相反,颜色采用与设备相关的格式。

这就是为什么GetDIBits需要一个HDC. 否则无法获取颜色信息。

也许一个好问题是,你从哪里得到一个HBITMAP没有伴随的HDC


如果您尝试在内存中创建此位图,首先您可以调用CreateCompatibleDC创建与某些设备兼容的内存 DC,然后使用该 DC创建兼容位图。然后你就可以随意使用HBITMAP和了。HDC否则,如果您不知道您的HBITMAP指向是什么,您就不能指望用它做任何有用的事情。