GetBitmapBits和GetDibits函数得到的图像数据的顺序是相反的
2011-04-10 16:01
597 查看
http://www.cnblogs.com/lzjsky/archive/2010/08/08/1795129.html
Windows GDI中有两个用来得到位图图像数据的API,分别是GetDIBits和GetBitmapBits;按照MSDN的解释,前者是用来得到设备独立位图的BITS,后者是得到兼容位图的BITS,所以在调用该函数的时候,第一个主要的区别是:GetBitmapBits需要提供一个设备内容,同时需要将位图的HANDLE选进这个设备内容(DC)才能能够得到位图的信息。
我想上面的区别大家可能都知道,其实它还隐藏着另一个区别:就是对于同一个位图,得到的BITS内容的BUFFER不一样!
大家都知道BMP文件存储数据是倒叙的,也就是从图像的右下角开始存储,文件的最后是图像的左上角(这个来历可以看:WINDOWS编程中介绍);使用GetBitmapBits取得的BUFFER,位图的右下角的内容为第一个字节,实际上和真正的图像字节应该是一样的,而GetDIBits刚好相反,其BUFFER的顺序符合BMP文件中的顺序,如果按照正常的坐标,其存储顺序应该是倒叙。
所以在程序中要合理的使用这两个API来得到你想要的位图数据。
!!!----这也是为何在 BOOL CAviapi::GetAviFrame(DWORD Index, HDC hdc, int x, int y, int cx, int cy, int ox, int oy, double scale)
中使用 StretchDIBits(hCacheDC, 0, 0, m_FrameWidth, m_FrameHeight,
0, 0, m_FrameWidth, m_FrameHeight,
(LPBYTE)(lpImage) + ImageStart,
(BITMAPINFO*)lpImage, 0, SRCCOPY);
向DC绘制,而不是直接将内存数据通过CBitmap::SetBitmapBits 写入位图的原因(---可能可以考虑用::SetDIBits--不过这里需要拉伸,所以用 StretchDIBits, )
!!!---GetBitmapBits是设备相关,使得你的程序很难维护,其实GetDibits一样可以得到从左到右从上到下的数据。
只要吧传入GetDibits中的BITMAPINFO结构的成员
BmpInfo.bmiHeader.biHeight=-Bmp.bmHeight'这与GDI的坐标系统相反,为方便,
'改为-值,则取得数据就是以左上角为起点
就一样了。
Windows GDI中有两个用来得到位图图像数据的API,分别是GetDIBits和GetBitmapBits;按照MSDN的解释,前者是用来得到设备独立位图的BITS,后者是得到兼容位图的BITS,所以在调用该函数的时候,第一个主要的区别是:GetBitmapBits需要提供一个设备内容,同时需要将位图的HANDLE选进这个设备内容(DC)才能能够得到位图的信息。
我想上面的区别大家可能都知道,其实它还隐藏着另一个区别:就是对于同一个位图,得到的BITS内容的BUFFER不一样!
大家都知道BMP文件存储数据是倒叙的,也就是从图像的右下角开始存储,文件的最后是图像的左上角(这个来历可以看:WINDOWS编程中介绍);使用GetBitmapBits取得的BUFFER,位图的右下角的内容为第一个字节,实际上和真正的图像字节应该是一样的,而GetDIBits刚好相反,其BUFFER的顺序符合BMP文件中的顺序,如果按照正常的坐标,其存储顺序应该是倒叙。
所以在程序中要合理的使用这两个API来得到你想要的位图数据。
!!!----这也是为何在 BOOL CAviapi::GetAviFrame(DWORD Index, HDC hdc, int x, int y, int cx, int cy, int ox, int oy, double scale)
中使用 StretchDIBits(hCacheDC, 0, 0, m_FrameWidth, m_FrameHeight,
0, 0, m_FrameWidth, m_FrameHeight,
(LPBYTE)(lpImage) + ImageStart,
(BITMAPINFO*)lpImage, 0, SRCCOPY);
向DC绘制,而不是直接将内存数据通过CBitmap::SetBitmapBits 写入位图的原因(---可能可以考虑用::SetDIBits--不过这里需要拉伸,所以用 StretchDIBits, )
!!!---GetBitmapBits是设备相关,使得你的程序很难维护,其实GetDibits一样可以得到从左到右从上到下的数据。
只要吧传入GetDibits中的BITMAPINFO结构的成员
BmpInfo.bmiHeader.biHeight=-Bmp.bmHeight'这与GDI的坐标系统相反,为方便,
'改为-值,则取得数据就是以左上角为起点
就一样了。
相关文章推荐
- GetObject 和 GetBitmapBits 获取位图数据的区别
- BMP、文件格式、调色板、GetBitmapBits函数使用散记
- GetBitmapBits和GetDIBits的区别(Windows GDI)
- GetBitmapBits与GetDIBits补零对齐的比较
- GetBitmapBits和GetDIBits的区别(Windows GDI)
- GetBitmapBits和GetDIBits的区别(Windows GDI)
- (vb)利用GetBitmapBits,SetBitmapBits加速图像处理
- 关于OpenCV中利用函数cvConvert实现图像数据类型转换(8U->16S)
- 一个按比特位拷贝数据的函数copybits
- 将一个5*5 矩阵中最大的放在中间,四个角分别放最小的数据,顺序分别是左右上下,通过函数完成。
- 用不同的方法将⼀个数组中的数据按相反的顺序存储
- . 有一个一维数组,里面存储整形数据,请写一个函数,将他们按从大到小的顺序排列,要求执行效率高,并说明如何改善执行效率(该函数必须自己实现,不能使用php函数)。
- gamma校正中两种不同的访问数据的方法为什么得到的校正图像不同??
- 数据结构——顺序表的创建及功能函数
- C++图像处理 -- 数据类型及公用函数
- SQL里利用自定义函数Group By 数据得到字符串
- setting-->category(debug)中选择Generate mapfile就可以在debug和release目录下面出现.map的文件,就可以得到函数的唯一入口
- 图像数据读取LockBits理解
- 复制 Excel 中使用公式或者函数得到的数据
- 串口协议匹配函数,避免串口数据接收时顺序换乱错误