一点关于位图的心得----CreateBitmap与CreatDIBSection比较
来源:互联网 发布:java单例模式线程安全 编辑:程序博客网 时间:2024/04/29 14:22
原文地址::http://blog.csdn.net/qq867346668/article/details/6256382
相关网帖
1.用二维数组创建显示位图----http://blog.csdn.net/sophistcxf/article/details/7846330
windows位图分为DDB和DIB,即设备相关位图和设备无关位图。
可以使用CreateBitmap() 和 CreatDIBSection()分别创建。
经过测试得知,使用CreateBitmap创建的位图无法返回颜色信息(应该是存在但windows不会返回给你),和它类似的还有Loadbitmap()和不带LR_CREATEDIBSECTION参数的LoadImage(), 例如:
HBITMAP hbitmp = LoadBitmap(0, "test.bmp"); // test.bmp为32位alpha通道位图
BITMAP bm;
GetObject(hbitmp, sizeof(BITMAP), &bm);
这样得到的bm中,bmBits为空指针。
如果采用带LR_CREATEDIBSECTION参数的LoadImage()后,调用GetObject(), 则可以得到BITMAP的完整信息。
另外一个要说明的地方是,如果使用CreatBitmap或CreatBitmapIndirect()创建位图后, 使用GetObject()返回的指针也为空。
例如:
HBITMAP hbitmp = LoadBitmap(0, "test.bmp");
BITMAP bmold;
BITMAP bmnew;
GetObject(hbitmp, sizeof(BITMAP), &bmold);
bmnew = bmold;
BYTE* newbits = (BYTE*)malloc(bmold.bmWidthBytes * bmold.bmHeight);
for (int i = 0; i != bmold.bmWidthBytes * bmold.bmHeight; ++i)
newbits[i] = bmold.bmBits[i];
bmnew.bmBits = newbits;
HBITMAP hbitmpnew = CreatBitmapIndirect(&bmnew);
BITMAP bm;
GetObject(hbitmpnew, sizeof(BITMAP), &bm);
解决办法是使用CreateDIBSection(), 代码如下:
HBITMAP hbmpold = LoadImage(0, L"testbmp.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE | LR_CREATEDIBSECTION);
BITMAPINFOHEADER bmih;
memset(&bmih, 0, sizeof(bmih));
bmih.biSize = sizeof(BITMAPINFOHEADER);
bmih.biWidth = bmold.bmWidth;
bmih.biHeight = bmold.bmHeight;
bmih.biPlanes = bmold.bmPlanes;
bmih.biBitCount = bmold.bmBitsPixel;
bmih.biCompression = BI_RGB;
HBITMAP hbmpnew = CreateDIBSection(NULL, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, (void**)&newbits, 0, 0);
for (int i = 0; i != bmold.bmWidthBytes * bmold.bmHeight; ++i)
newbits[i] = bmold.bmBits[i];
使用上面的方法,GetObject()可以得到指针信息。
另外需要注意的是,CreateDIBSection()是从下向上建立位图的, 也就是说newbits指针指向的第一个元素是整个图片最下面一行的第一位。CreateBitmap建立是自上而下的。
- 一点关于位图的心得----CreateBitmap与CreatDIBSection比较
- 一点关于位图的心得
- 关于安装win7与linux双系统的一点心得
- c语言中关于数组与指针的一点心得
- 关于线程的一点心得
- 关于管理的一点心得
- 关于call_user_func的一点心得
- 关于“日志”的一点心得
- 关于 Quaternion 的一点心得
- 关于指针的一点心得
- 关于随机数的一点心得
- 关于scanf的一点心得。
- 关于JS的一点心得
- 关于CBitmap的一点心得
- 关于制作透明位图的一点理解
- C++与C#关于虚函数调用的一点比较
- 关于乱码的一点小小的心得
- 转的一个帖子 关于CreateBitmap
- JAVA.SWT/JFace: JFace篇之JFace对话框以及日历DateTime控件
- 插入失效
- 黑马程序员_C#面向对象知识总结3
- 推荐数 Top 10的书
- request.getAttribute和getParameter区别
- 一点关于位图的心得----CreateBitmap与CreatDIBSection比较
- Cocos2d-x学习之 整体框架描述
- Cocos2d-x 学习之引擎介绍
- 增量模式--呵呵,自己起名的调试手段
- Win8探索学习笔记
- UIScrollView的详细讲解
- IP网络层
- Project Euler problem 39
- displaytag手册