首页 > 其他 > 详细

8.3.1 Bitmap格式分析和数据提取

时间:2020-02-29 15:16:40      阅读:73      评论:0      收藏:0      [点我收藏+]

转载:https://www.cnblogs.com/liusiluandzhangkun/p/8856449.html
转载: https://blog.51cto.com/redwolf/229096

1.简介

位图(Bitmap),它Windows显示图片的基本格式,其文件扩展名为*.BMP。在Windows下,任何各式的图片文件(包括视频播放)都要转化为位图个时候才能显示出来,各种格式的图片文件也都是在位图格式的基础上采用不同的压缩算法生成的

2. BMP文件的格式

技术分享图片

文件信息头BITMAPFILEHEADER

结构体定义如下:
typedef struct tagBITMAPFILEHEADER { /* bmfh */
    UINT bfType;          //UINT 2字节
    DWORD bfSize;         //DWORD 4字节
    UINT bfReserved1; 
    UINT bfReserved2; 
    DWORD bfOffBits;
} BITMAPFILEHEADER;

技术分享图片

位图信息头BITMAPINFOHEADER

结构体定义如下:
typedef struct tagBITMAPINFOHEADER { /* bmih */
    DWORD biSize;
    LONG biWidth;         //LONG 四字节
    LONG biHeight; 
    WORD biPlanes; 
    WORD biBitCount; 
    DWORD biCompression; 
    DWORD biSizeImage; 
    LONG biXPelsPerMeter; 
    LONG biYPelsPerMeter; 
    DWORD biClrUsed; 
    DWORD biClrImportant;
} BITMAPINFOHEADER;

技术分享图片

RGB颜色阵列

有关RGB三色空间我想大家都很熟悉,这里我想说的是在Windows下,RGB颜色阵列存储的格式其实BGR。也就是说,对于24位的RGB位图像素数据格式是:
技术分享图片

对于32位的RGB位图像素数据格式是:
技术分享图片

透明通道也称Alpha通道,该值是该像素点的透明属性,取值在0(全透明)到255(不透明)之间。对于24位的图像来说,因为没有Alpha通道,故整个图像都不透明。

3.加载和使用

1.加载文件头

//Load the file header
BITMAPFILEHEADER header;
memset(&header, 0, sizeof(header));
inf.read((char*)&header, sizeof(header));
if(header.bfType != 0x4D42)
    return false;

2.加载位图信息

//Load the image information header
BITMAPINFOHEADER infoheader;
memset(&infoheader, 0, sizeof(infoheader));
inf.read((char*)&infoheader, sizeof(infoheader));
m_iImageWidth = infoheader.biWidth;
m_iImageHeight = infoheader.biHeight;
m_iBitsPerPixel = infoheader.biBitCount;

这里我们得到了3各重要的图形属性:宽,高,以及每个像素颜色所占用的位数。

3.行对齐

由于Windows在进行扫描的时候最小的单位为4个字节,所以当图片宽 X 每个像素的字节数 != 4的整数倍时要在每行的后面补上缺少的字节,以0填充(一般来说当图像宽度为2的幂时不需要对齐)。位图文件里的数据在写入的时候已经进行了行对齐,也就是说加载的时候不需要再做行对齐。但是这样一来图片数据的长度就不是:宽 X 高 X 每个像素的字节数了,我们需要通过下面的方法计算正确的数据长度:

//Calculate the image data size
int iLineByteCnt = (((m_iImageWidth*m_iBitsPerPixel) + 31) >> 5) << 2;
m_iImageDataSize = iLineByteCnt * m_iImageHeight;

4.加载图片数据

对于24位和32位的位图文件,位图数据的偏移量为sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER),也就是说现在我们可以直接读取图像数据了。

if(m_pImageData) delete []m_pImageData;
m_pImageData = new unsigned char[m_iImageDataSize];
inf.read((char*)m_pImageData, m_iImageDataSize);

如果你足够细心,就会发现内存m_pImageData里的数据的确是BGR格式,可以用个纯蓝色或者是纯红色的图片测试一下。

5.绘制

占个坑,等后面分析整体的代码时,在来填

8.3.1 Bitmap格式分析和数据提取

原文:https://www.cnblogs.com/huangdengtao/p/12380807.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!