得到HBITMAP字节(Get bytes from HBITMAP)

2019-07-17 23:40发布

我怎样才能得到,如果我给出一个HBITMAP指针,我的应用程序是控制台应用程序图像从HBITMAP字节。 我tryed使用需要这样的参数为HDC,我不能得到的GetDIBits。

编辑:我加载的位图文件来自:

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获得的图像字节。

Answer 1:

看到新的答案,因为问题被编辑...

没有一个句柄设备上下文(你不能做到这一点HDC )。 这是因为GetDIBits期待一个HBITMAP这是

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

甲DDB是一个设备相关位图 ,(而不是一个DIB,或设备无关位图)。 这意味着:

请注意,DDB中不包含的颜色值; 相反,颜色是依赖于设备的格式。

这就是为什么GetDIBits需要一个HDC 。 否则就不能获得颜色信息。

也许是一个很好的问题是,你从哪里得到的HBITMAP ,而没有相关HDC


如果你想创建此位图在内存中,首先你可以调用CreateCompatibleDC创建一个内存DC与一些设备兼容,那么CreateCompatibleBitmap与DC。 然后,你有一个HBITMAPHDC用,请你工作。 否则,如果你不知道你的HBITMAP指向,你不能指望做任何有用的事情。



Answer 2:

最简单的方法是使用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位反正这是几乎大部分时间的问题。



Answer 3:

由于您使用LoadImage得到HBITMAP ,那么这的确是一个DIB(设备无关位图)(他们称之为一个DIBSection)。 但是,你没有的颜色信息。

这MSDN HOWTO告诉您如何选择DIBSECTION到一个内存DC。 然后,他们继续使用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 。 我不知道是完全必要的,但他们这样做。 我把它在这里的清晰度。



Answer 4:

什么工作对我们来说是这样的:打电话GetDIBits而正确的调色板(如果索引颜色)仍然选择到设备上下文。 (如果没有调色板中选择,颜色得到了乱码。)

但是,在我们使用的情况下,事实证明,DIB部分进行好了很多,所以检查出的那些,以及和基准。 然而,也有一些陷阱。 的Windows不会使用调色板,我们只好打电话SetDIBColorTable使用前。 但设备上下文仍然需要一个条目(只有黑色)虚拟调色板中选择和实现到设备上下文另有视窗也将忽略调色板由设置SetDIBColorTable 。 无论SetDIBColorTableRealizePalette需要存在,否则颜色会出现乱码。



Answer 5:

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

只是通过HBITMAP处理,你会得到你的字节



文章来源: Get bytes from HBITMAP