如何在vc 中旋转位图

文章作者 100test 发表时间 2007:10:10 13:03:53
来源 100Test.Com百考试题网


  第一步,你必须知道位图即BMP格式的文件的结构.
  位图(bmp)文件由以下几个部分组成:
  1.BITMAPFILEHEADER,它的定义如下:
  typedef struct tagBITMAPFILEHEADER
  {
   WORD  bfType.     //必须为’BM’
   DWORD  bfSize.     //文件大小
   WORD  bfReserved1. //必须为0
   WORD  bfReserved2. //必须为0
   DWORD  bfOffBits.  //从ITMAPFILEHEADER到存放bmp数据的偏移量                 
  } BITMAPFILEHEADER, *PBITMAPFILEHEADER.
  2.BITMAPINFOHEADER,它的定义如下:
  typedef struct tagBITMAPINFOHEADER
  {
   DWORD biSize. //此结构的大小,可用sizeof(BITMAPINFOHEAER)得到
   LONG  biWidth. //位图宽度,以象素为单位
   LONG  biHeight. //位图高度,以象素为单位
   WORD  biPlanes. //必须为1
   WORD  biBitCount.//位图象素位数,可为0,1,4,8,24,32
   DWORD biCompression.
   DWORD biSizeImage. //(仅用于压缩)
   LONG  biXPelsPerMeter. //一米横向象素数
   LONG  biYPelsPerMeter. //一米纵向象素数
   DWORD biClrUsed.// (非零用语短颜色表)
   DWORD biClrImportant.
  } BITMAPINFOHEADER, *PBITMAPINFOHEADER.
  由于以上信息可以直接从MSDN上查到,所以只做简单介绍,你可以自己查看NSDN帮助,上面有很详细的介绍.
  3.DIB位图像.这里放的是真正的位图数据.
  知道了位图的存放格式,下面我们就可以很容易的把它读如内存.
  第二步,读入bmp图像
  LPCTSTR lpszFileName4="untitled.bmp".  //文件路径
  CFile file.                   //用于读取BMP文件
  BITMAPFILEHEADER bfhHeader.//bmp文件头
  BITMAPINFOHEADER bmiHeader. //bmp格式头
  LPBITMAPINFO lpBitmapInfo.  //bmp格式具体信息
  int bmpWidth=0.             //图片宽度
  int bmpHeight = 0.           //图片高度      
  if(!file.Open(lpszFileName,CFile::modeRead))
  return .               //打开文件
  file.Read(&.bfhHeader,sizeof(BITMAPFILEHEADER)).//读取文件头
  if(bfhHeader.bfType!=((WORD) (’M’<<8)|’B’))      //判断是否是"BM"
  return .
  if(bfhHeader.bfSize!=file.GetLength())
  return .
  if (file.Read((LPSTR)&.bmiHeader, sizeof(bmiHeader)) != sizeof(bmiHeader))
  return .
  bmpHeight = bmiHeader.biHeight.//得到高度和宽度
  bmpWidth = bmiHeader.biWidth.
  file.SeekToBegin().
  file.Read(&.bfhHeader,sizeof(BITMAPFILEHEADER)).
  UINT uBmpInfoLen=(UINT) bfhHeader.bfOffBits-sizeof(BITMAPFILEHEADER).
  lpBitmapInfo=(LPBITMAPINFO) new BYTE[uBmpInfoLen].
  file.Read((LPVOID) lpBitmapInfo,uBmpInfoLen).
  if((* (LPDWORD)(lpBitmapInfo))!=sizeof(BITMAPINFOHEADER))
  return .
  DWORD dwBitlen=bfhHeader.bfSize - bfhHeader.bfOffBits.
  LPVOID lpSrcBits=new BYTE[dwBitlen].     //将数据读入lpSrcBits数组
  file.ReadHuge(lpSrcBits,dwBitlen).
  file.Close().                           //关闭文件


相关文章


从FORM中调用REPORT的实用技巧
报检考试法规:中华人民共和国对外贸易法
Oracle中对像名大小写敏感性的深入解析
甲骨文亚太大会今日在沪开幕
如何在vc 中旋转位图
C 内存管理基础之new&0delete
C 编程中的四个调试小技巧
轻松使用C 深入研究.NET委托与事件设计
C 基础:常量成员函数特殊说明
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛