VC6.0读取BMP图像信息到BYTE数组

  1. #include "stdafx.h"  
  2. //注意测试的bmp图像的位图的位数为256  
  3. #include <math.h>  
  4. #include <iomanip.h>   
  5. #include <stdlib.h>  
  6. #include <windows.h>  
  7. #include <stdio.h>  
  8. #include <stdlib.h>  
  9. #include <iostream.h>  
  10. #include <fstream.h>  
  11.   
  12. unsigned char *pBmpBuf;//读入图像数据的指针  
  13. int bmpWidth;//图像的宽  
  14. int bmpHeight;//图像的高  
  15. RGBQUAD *pColorTable;//颜色表指针  
  16. int biBitCount;//图像类型,每像素位数  
  17. //-------------------------------------------------------------------------------------------  
  18. //读图像的位图数据、宽、高、颜色表及每像素位数等数据进内存,存放在相应的全局变量中  
  19. bool readBmp(char *bmpName)  
  20. {  
  21.     FILE *fp=fopen(bmpName,"rb");//二进制读方式打开指定的图像文件  
  22.     if(fp==0) return 0;  
  23.     //跳过位图文件头结构BITMAPFILEHEADER  
  24.     fseek(fp, sizeof(BITMAPFILEHEADER),0);  
  25.     //定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中  
  26.     BITMAPINFOHEADER head;   
  27.     fread(&head, sizeof(BITMAPINFOHEADER), 1,fp); //获取图像宽、高、每像素所占位数等信息  
  28.     bmpWidth = head.biWidth;  
  29.     bmpHeight = head.biHeight;  
  30.     biBitCount = head.biBitCount;//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)  
  31.     int lineByte=(bmpWidth * biBitCount/8+3)/4*4;//灰度图像有颜色表,且颜色表表项为256  
  32.     if(biBitCount==8)  
  33.      {  
  34.             //申请颜色表所需要的空间,读颜色表进内存  
  35.             pColorTable=new RGBQUAD[256];  
  36.             fread(pColorTable,sizeof(RGBQUAD),256,fp);  
  37.      }  
  38.     //申请位图数据所需要的空间,读位图数据进内存  
  39.     pBmpBuf=new unsigned char[lineByte * bmpHeight];  
  40.     fread(pBmpBuf,1,lineByte * bmpHeight,fp);  
  41.     fclose(fp);//关闭文件  
  42.     return 1;//读取文件成功  
  43. }  
  44. //-----------------------------------------------------------------------------------------  
  45. //给定一个图像位图数据、宽、高、颜色表指针及每像素所占的位数等信息,将其写到指定文件中  
  46. bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height, int biBitCount, RGBQUAD *pColorTable)  
  47. {  
  48.     //如果位图数据指针为0,则没有数据传入,函数返回  
  49.     if(!imgBuf)  
  50.         return 0;  
  51.     //颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0  
  52.     int colorTablesize=0;  
  53.     if(biBitCount==8)  
  54.         colorTablesize=1024;  
  55.     //待存储图像数据每行字节数为4的倍数  
  56.     int lineByte=(width * biBitCount/8+3)/4*4;  
  57.     //以二进制写的方式打开文件  
  58.     FILE *fp=fopen(bmpName,"wb");  
  59.     if(fp==0) return 0;  
  60.     //申请位图文件头结构变量,填写文件头信息  
  61.     BITMAPFILEHEADER fileHead;  
  62.     fileHead.bfType = 0x4D42;//bmp类型  
  63.     //bfSize是图像文件4个组成部分之和  
  64.     fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + colorTablesize + lineByte*height;  
  65.     fileHead.bfReserved1 = 0;  
  66.     fileHead.bfReserved2 = 0;  
  67.     //bfOffBits是图像文件前3个部分所需空间之和  
  68.     fileHead.bfOffBits=54+colorTablesize;  
  69.     //写文件头进文件  
  70.     fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp);  
  71.     //申请位图信息头结构变量,填写信息头信息  
  72.     BITMAPINFOHEADER head;  
  73.     head.biBitCount=biBitCount;  
  74.     head.biClrImportant=0;  
  75.     head.biClrUsed=0;  
  76.     head.biCompression=0;  
  77.     head.biHeight=height;  
  78.     head.biPlanes=1;  
  79.     head.biSize=40;  
  80.     head.biSizeImage=lineByte*height;  
  81.     head.biWidth=width;  
  82.     head.biXPelsPerMeter=0;  
  83.     head.biYPelsPerMeter=0;  
  84.     //写位图信息头进内存  
  85.     fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);  
  86.     //如果灰度图像,有颜色表,写入文件  
  87.     if(biBitCount==8)  
  88.         fwrite(pColorTable, sizeof(RGBQUAD),256, fp);  
  89.     //写位图数据进文件  
  90.     fwrite(imgBuf, height*lineByte, 1, fp);  
  91.     //关闭文件  
  92.     fclose(fp);  
  93.     return 1;  
  94. }  
  95.   
  96. //----------------------------------------------------------------------------------------  
  97. //以下为像素的读取函数  
  98. void doIt()  
  99. {  
  100.     //读入指定BMP文件进内存  
  101.     char readPath[]="Lena.BMP";  
  102.     readBmp(readPath);  
  103.     //输出图像的信息  
  104.     cout<<"width="<<bmpWidth<<" height="<<bmpHeight<<" biBitCount="<<biBitCount<<endl;  
  105.     //循环变量,图像的坐标  
  106.     //每行字节数  
  107.     int lineByte=(bmpWidth*biBitCount/8+3)/4*4;  
  108.     //循环变量,针对彩色图像,遍历每像素的三个分量  
  109.     int m=0,n=0,count_xiang_su=0;  
  110.     //将图像左下角1/4部分置成黑色  
  111.     ofstream outfile("图像像素.txt",ios::in|ios::trunc);  
  112.      if(!outfile)  
  113.     {  
  114.         cout<<"open error!"<<endl;  
  115.         exit(1);  
  116.      }  
  117.      if(biBitCount==8) //对于灰度图像  
  118.      {               
  119.     //------------------------------------------------------------------------------------  
  120.     //以下完成图像的分割成8*8小单元,并把像素值存储到指定文本中。由于BMP图像的像素数据是从  
  121.     //左下角:由左往右,由上往下逐行扫描的  
  122.         int L1=0;  
  123.         int hang=63;  
  124.         int lie=0;  
  125.         for(int fen_ge_hang=0;fen_ge_hang<8;fen_ge_hang++)//64*64矩阵行循环  
  126.         {  
  127.          for(int fen_ge_lie=0;fen_ge_lie<8;fen_ge_lie++)//64*64列矩阵循环  
  128.          {  
  129.           //--------------------------------------------  
  130.           for(L1=hang;L1>hang-8;L1--)//8*8矩阵行  
  131.           {  
  132.             for(int L2=lie;L2<lie+8;L2++)  
  133.             {  
  134.               m=*(pBmpBuf+L1*lineByte+L2);  
  135.               outfile<<m<<" ";  
  136.               count_xiang_su++;  
  137.               if(count_xiang_su%8==0)//每8*8矩阵读入文本文件  
  138.               {  
  139.                 outfile<<endl;  
  140.               }  
  141.             }  
  142.           }  
  143.          hang=63-fen_ge_hang*8;//64*64矩阵行变换  
  144.          lie+=8;//64*64矩阵列变换  
  145.          //该一行(64)由8个8*8矩阵的行组成  
  146.          }  
  147.          hang-=8;//64*64矩阵的列变换  
  148.          lie=0;//64*64juzhen  
  149.         }  
  150.      }  
  151.      else if(biBitCount==24)  
  152.      {//彩色图像  
  153.        for(int i=0;i<bmpHeight;i++)  
  154.        {  
  155.             for(int j=0;j<bmpWidth;j++)  
  156.             {  
  157.                 for(int k=0;k<3;k++)//每像素RGB三个分量分别置0才变成黑色  
  158.                 {  
  159.                     m=*(pBmpBuf+i*lineByte+j*3+k);  
  160.                     outfile<<m<<" ";  
  161.                     count_xiang_su++;  
  162.                      if(count_xiang_su%8==0)  
  163.                      {  
  164.                       outfile<<endl;  
  165.                      }  
  166.                 }  
  167.               n++;  
  168.             }  
  169.         }  
  170.        cout<<"总的像素个素为:"<<n<<endl;  
  171.        cout<<"----------------------------------------------------"<<endl;  
  172.     }  
  173.     //将图像数据存盘  
  174.     char writePath[]="nvcpy.BMP";//图片处理后再存储  
  175.     saveBmp(writePath, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);  
  176.     //清除缓冲区,pBmpBuf和pColorTable是全局变量,在文件读入时申请的空间  
  177.     delete []pBmpBuf;  
  178.     if(biBitCount==8)  
  179.         delete []pColorTable;  
  180. }  
  181.   
  182. int main()  
  183. {  
  184.     doIt();  
  185.     return 0;  
  186. }  

From:http://blog.sina.com.cn/s/blog_8bdd25f80101900h.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值