龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

vc实现BMP位图文件结构及平滑缩放(2)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
5. 位图数据 位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数: 当biBitCo

  5. 位图数据
  位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:
  当biBitCount=1时,8个像素占1个字节;
  当biBitCount=4时,2个像素占1个字节;
  当biBitCount=8时,1个像素占1个字节;
  当biBitCount=24时,1个像素占3个字节;

  Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充,一个扫描行所占的字节数计算方法:

DataSizePerLine= (biWidth* biBitCount+31)/8;
// 一个扫描行所占的字节数
DataSizePerLine= DataSizePerLine/4*4; // 字节数必须是4的倍数
位图数据的大小(不压缩情况下):
DataSize= DataSizePerLine* biHeight;

二、BMP位图一般显示方法
  1. 申请内存空间用于存放位图文件
  GlobalAlloc(GHND,FileLength);

  2. 位图文件读入所申请内存空间中
  LoadFileToMemory( mpBitsSrc,mFileName);

  3. 在OnPaint等函数中用创建显示用位图
  用CreateDIBitmap()创建显示用位图,用CreateCompatibleDC()创建兼容DC,
  用SelectBitmap()选择显示位图。

  4. 用BitBlt或StretchBlt等函数显示位图

  5. 用DeleteObject()删除所创建的位图

  以上方法的缺点是: 1)显示速度慢; 2) 内存占用大; 3) 位图在缩小显示时图形失真大,(可通过安装字体平滑软件来解决); 4) 在低颜色位数的设备上(如256显示模式)显示高颜色位数的图形(如真彩色)图形失真严重。

三、BMP位图缩放显示
  用DrawDib视频函数来显示位图,内存占用少,速度快,而且还可以对图形进行淡化(Dithering)处理。淡化处理是一种图形算法,可以用来在一个支持比图像所用颜色要少的设备上显示彩色图像。BMP位图显示方法如下:

  1. 打开视频函数DrawDibOpen(),一般放在在构造函数中

  2. 申请内存空间用于存放位图文件

GlobalAlloc(GHND,FileLength);

  3. 位图文件读入所申请内存空间中

LoadFileToMemory( mpBitsSrc,mFileName);

  4. 在OnPaint等函数中用DrawDibRealize(),DrawDibDraw()显示位图

  5. 关闭视频函数DrawDibClose(),一般放在在析构函数中

  以上方法的优点是: 1)显示速度快; 2) 内存占用少; 3) 缩放显示时图形失真小,4) 在低颜色位数的设备上显示高颜色位数的图形图形时失真小; 5) 通过直接处理位图数据,可以制作简单动画。

精彩图集

赞助商链接