如果给出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位,因此这在大多数情况下都不是问题.
问题编辑后查看新答案...
如果没有设备上下文句柄 ( HDC),则无法执行此操作。这是因为GetDIBits期望一个HBITMAPwhich是
位图的句柄。这必须是兼容位图 (DDB)。
DDB 是设备相关位图(与 DIB 或设备无关位图相对)。这意味着:
请注意,DDB 不包含颜色值;相反,颜色采用与设备相关的格式。
这就是为什么GetDIBits需要一个HDC. 否则无法获取颜色信息。
也许一个好问题是,你从哪里得到一个HBITMAP没有伴随的HDC?
如果您尝试在内存中创建此位图,首先您可以调用CreateCompatibleDC创建与某些设备兼容的内存 DC,然后使用该 DC创建兼容位图。然后你就可以随意使用HBITMAP和了。HDC否则,如果您不知道您的HBITMAP指向是什么,您就不能指望用它做任何有用的事情。
| 归档时间: |
|
| 查看次数: |
16744 次 |
| 最近记录: |