从HBITMAP获取字节

时间:2013-01-08 03:06:02

标签: 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);

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

HBITMAP out1 = func(bm);

func是:

HBITMAP func(HBITMAP im);

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

5 个答案:

答案 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。然后,您可以随时使用HBITMAPHDC。否则,如果您不知道HBITMAP指向的是什么,您就不能期望对它做任何有用的事情。

答案 4 :(得分:0)

您甚至可以从控制台尝试GetBitmapBits API。更多信息: http://msdn.microsoft.com/en-us/library/windows/desktop/dd144850%28v=vs.85%29.aspx

只需传递HBITMAP句柄即可获得你的字节