您的位置:首页 > 其它

手机开发实战149——BMP介绍4

2016-06-12 21:56 363 查看
加载文件

  加载文件的目的是要得到图片属性,以及RGB数据,然后可以将其绘制在DC上(GDI),或是生成纹理对象(3D:OpenGL/Direct3D)。

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、绘制

  好了,数据和属性我们都有了,现在就可以拿来随便用了,就和吃馒头一样,爱粘白糖粘白糖,爱粘红糖粘红糖。下面是GDI绘制代码,仅作参考:

  void CImage::DrawImage(HDC hdc, int iLeft, int iTop, int iWidth, int iHeight)

  {

  if(!hdc || m_pImageData == NULL)

  return;

  BITMAPINFO bmi;

  memset(&bmi, 0, sizeof(bmi));

  bmi.bmiHeader.biSize = sizeof(BITMAPINFO);

  bmi.bmiHeader.biWidth = m_iImageWidth;

  bmi.bmiHeader.biHeight = m_iImageHeight;

  bmi.bmiHeader.biPlanes = 1;

  bmi.bmiHeader.biBitCount = m_iBitsPerPixel;

  bmi.bmiHeader.biCompression = BI_RGB;

  bmi.bmiHeader.biSizeImage = m_iImageDataSize;

  StretchDIBits(hdc, iLeft, iTop, iWidth, iHeight,

  0, 0, m_iImageWidth, m_iImageHeight,

  m_pImageData, &bmi, DIB_RGB_COLORS, SRCCOPY);

  }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: