C++读取bmp图片的例子

  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <malloc.h>
  5.  
  6. #define WIDTHBYTES(x) ((x+31)/32*4)
  7. #define my(x) ( ( (x + 31) & ~31) / 8)
  8.  
  9. BITMAPFILEHEADER bf; //BMP文件头结构体
  10. BITMAPINFOHEADER bi; //BMP信息头结构体
  11.  
  12. int i,j;
  13. RGBQUAD *ipRGB; //颜色表
  14. DWORD NumColors; //颜色表数目
  15. unsigned char ** Imgdata;
  16.  
  17. void read(char*);
  18. void display();
  19. void org(char*);
  20. void gray(char*);
  21.  
  22. void test()
  23. {
  24. DWORD LineByte;
  25. DWORD ImgSize;
  26. LineByte=(DWORD)my(bi.biWidth*bi.biBitCount); //计算位图的实际宽度并确保它为32的倍数
  27. ImgSize=(DWORD)LineByte*bi.biHeight;
  28. printf("LineByte is %d. \n", LineByte);
  29. printf("ImgSize is %d. \n", ImgSize);
  30. }
  31.  
  32. int main()
  33. {
  34. char *filename;
  35. filename="U616.bmp";
  36. read(filename);
  37. display();
  38. test();
  39. org("123.bmp");
  40. free(Imgdata);
  41. // printf("<2>");
  42. // display();
  43. free(ipRGB);
  44. system("pause");
  45. return ;
  46. }
  47.  
  48. void read(char* filename)
  49. {
  50. FILE* fp;
  51. fp=fopen(filename,"rb");
  52. if(fp == NULL)
  53. {
  54. printf("Open file error!");
  55. exit();
  56. }
  57.  
  58. //读取信息头、文件头
  59. fread(&bf,sizeof(BITMAPFILEHEADER),,fp);
  60. fread(&bi,sizeof(BITMAPINFOHEADER),,fp);
  61.  
  62. if (bi.biClrUsed != )
  63. NumColors=(DWORD)bi.biClrUsed;
  64. else
  65. switch (bi.biBitCount)
  66. {
  67. case : NumColors=; break;
  68. case : NumColors=; break;
  69. case : NumColors=; break;
  70. case : NumColors=; break;
  71. }
  72.  
  73. //分配调色板内存
  74. ipRGB=(RGBQUAD *)malloc(NumColors*sizeof(RGBQUAD));
  75. fread(ipRGB,sizeof(RGBQUAD),NumColors,fp);
  76.  
  77. Imgdata=new unsigned char*[bi.biHeight]; //声明一个指针数组
  78. if(bi.biBitCount==)
  79. {
  80. for ( i=(bi.biHeight)-;i>=;i--)
  81. Imgdata[i]=new unsigned char[bi.biWidth*]; //每个数组元素也是一个指针数组
  82.  
  83. for ( i=(bi.biHeight)-;i>=;i--)
  84. for(j=;j<bi.biWidth*;j++)
  85. fread(&Imgdata[i][j],,,fp);//每次只读取一个1字节,存入数组
  86. }
  87. else
  88. {
  89. for ( i=(bi.biHeight)-;i>=;i--)
  90. Imgdata[i]=new unsigned char[bi.biWidth];
  91.  
  92. for ( i=(bi.biHeight)-;i>=;i--)
  93. for(j=;j<bi.biWidth;j++)
  94. fread(&Imgdata[i][j],,,fp);
  95. }
  96.  
  97. fclose(fp);
  98. }
  99.  
  100. void org(char *filename)
  101. {
  102. FILE* fp;
  103. fp=fopen(filename,"wb");
  104. fwrite(&bf,sizeof(BITMAPFILEHEADER),,fp); //写文件头
  105. fwrite(&bi,sizeof(BITMAPINFOHEADER),,fp); //写信息头
  106. fwrite(ipRGB,sizeof(RGBQUAD),NumColors,fp);//写颜色头
  107.  
  108. if(bi.biBitCount==)
  109. for (i=(bi.biHeight)- ;i>=;i--)
  110. for (j= ;j<my(bi.biWidth*);j++)
  111. fwrite(&Imgdata[i][j],,,fp);
  112. else
  113. for (i=(bi.biHeight)- ;i>=;i--)
  114. for (j= ;j<bi.biWidth;j++)
  115. fwrite(&Imgdata[i][j],,,fp);
  116. fclose(fp);
  117. }
  118.  
  119. void gray(char *filename)
  120. {
  121. FILE* fp;
  122. fp=fopen(filename,"wb");
  123. /*
  124. bf.bfOffBits=(DWORD)1078;
  125. bi.biSizeImage=(DWORD)(bi.biWidth*bi.biHeight);
  126. bf.bfSize=bi.biSizeImage+bf.bfOffBits;
  127. bi.biBitCount=(WORD)8;
  128. bi.biClrUsed=(DWORD)256;
  129. bi.biClrImportant=(DWORD)256;
  130. bi.biXPelsPerMeter=(LONG)0;
  131. bi.biYPelsPerMeter=(LONG)0;
  132. NumColors=(DWORD)bi.biClrUsed;
  133. ipRGB=(RGBQUAD *)malloc(NumColors*sizeof(RGBQUAD));
  134. */
  135. fwrite(&bf,sizeof(BITMAPFILEHEADER),,fp); //写文件头
  136. fwrite(&bi,sizeof(BITMAPINFOHEADER),,fp); //写信息头
  137. fwrite(ipRGB,sizeof(RGBQUAD),NumColors,fp);//写颜色头
  138.  
  139. char temp;
  140. for (i=(bi.biHeight)- ;i>=;i--)
  141. for (j= ;j<bi.biWidth*;j++)
  142. if(j%==)
  143. {
  144. temp=(Imgdata[i][j]*+Imgdata[i][j+]*+Imgdata[i][j+]*)>>;
  145. fwrite(&temp,,,fp);
  146. }
  147. else
  148. {
  149. fwrite(&temp,,,fp);
  150. }
  151. fclose(fp);
  152. }
  153.  
  154. void display()
  155. {
  156. printf("tagBITMAPFILEHEADER info is: %d\n",sizeof(BITMAPFILEHEADER));
  157. printf("bfType is %d.\n", bf.bfType);
  158. printf("bfSize is %d.\n", bf.bfSize);
  159. printf("bfReserved1 is %d.\n", bf.bfReserved1);
  160. printf("bfReserved2 is %d.\n", bf.bfReserved2);
  161. printf("bfOffBits is %d.\n", bf.bfOffBits);
  162.  
  163. printf("\ntagBITMAPINFOHEADER info is: %d\n",sizeof(BITMAPINFOHEADER));
  164. printf("biSize is %d. \n", bi.biSize);
  165. printf("biWidth is %ld.\n", bi.biWidth);
  166. printf("biHeight is %ld.\n", bi.biHeight);
  167. printf("biPlanes is %d. \n", bi.biPlanes);
  168. printf("biBitCount is %d. \n", bi.biBitCount); //每像素所需位数
  169. printf("biCompression is %d. \n", bi.biCompression);
  170. printf("biSizeImage is %d. \n", bi.biSizeImage);
  171. printf("biXPelsPerMerer is %ld.\n", bi.biXPelsPerMeter); //每米像素数
  172. printf("biYPelsPerMerer is %ld.\n", bi.biYPelsPerMeter);
  173. printf("biClrUsed is %d. \n", bi.biClrUsed);
  174. printf("biClrImportant is %d. \n", bi.biClrImportant);
  175. printf("\nNum of colors is %d. \n", NumColors);
  176. }

bmp图片格式及读取的更多相关文章

  1. c语言数字图像处理(一):bmp图片格式及灰度图片转换

    本篇文章首先介绍了bmp图片格式,主要参考wiki上的内容,包括bmp文件的存储方式,对于一些常见的bmp文件格式都给了例子,并且对8位 16位RGB555 16位RGB565格式的bmp文件进行了简 ...

  2. BMP图片格式

    BMP图片 BMP采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大.BMP文件的图像深度可选lbit.4bit.8bit及24bit和32bit.BMP文 ...

  3. BMP图片格式模型(2)

    因为公司的主要业务是图像识别相关的,因此对图像处理.识别是我学习的重点.虽然写程序也不少年了,但是对于图像处理领域,我还是一个新兵.对很多基础的概念也还是存在盲区,所以想在边学边做的过程中,对一些概念 ...

  4. BMP图片格式模型

    BMP BMP(全称Bitmap)是Window操作系统中的标准图像文件格式 可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广. 它采用位映射存储格式,除了图像深度可选以外,不 ...

  5. BMP 图片格式

     BMP根据颜色深度,可以分为2(1位).16(4位).256(8位).65536(16位)和1670万(24位)以及32位含有alpha通道.8位图像可以是 索引彩色图像外,也可以是灰阶图像,而索引 ...

  6. VC++使用CImage在内存中Jpeg转换Bmp图片

    VC++中Jpeg与Bmp图片格式互转应该是会经常遇到,Jpeg相比Bmp在图片大小上有很大优势. 本文重点介绍使用现有的CImage类在内存中进行转换,不需要保存为文件,也不需要引入第三方库. Li ...

  7. BMP图片解析

    本博客参考:https://www.cnblogs.com/l2rf/p/5643352.html 一.简介 BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Window ...

  8. linu下C语言之BMP图片操作编程(上)

    BMP文件格式,也被称为位图图像文件或与设备无关的位图文件格式(DIB)或者只是一个位图,是 一个光栅图形 图像文件格式使用 来存储位图,数字,图片,独立的显示设备. 微软已经定义了一个特定的表示颜色 ...

  9. OPENGL 显示BMP图片+旋转

    VS2010/Windows 7/ 1. 需包含头文件 stdio.h, glaux.h, glut.h.需要对应的lib,并添加包含路径 2. 窗口显示用glut库的函数 3. bmp图片从本地读取 ...

随机推荐

  1. MATLAB常用指令记录

    help + 'command name' % 查询指令用法 Ctrl + Break % 强制终止程序运行 Shift + Enter % command window下换行不运行指令 M'; % ...

  2. 高通LCD驱动调试

    本文转载自:http://www.itgo.me/a/x6305658852004979994/lcd%20qcom 来自 :http://blog.csdn.net/dacaozuo/article ...

  3. poj 2186 Popular Cows 【强连通分量Tarjan算法 + 树问题】

    题目地址:http://poj.org/problem?id=2186 Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Sub ...

  4. linux运维面试题1

    一.填空题 1. 在Linux 系统 中,以文件方式访问设备 . 2. Linux 内核引导时,从文件/etc/fstab中读取要加载的文件系统 . 3. Linux 文件系统中每个文件用indoe节 ...

  5. MyEclipse Could not create the view: An unexpected exception was thrown解决方案

    问题:电脑突然断电,myeclipse非正常关闭,“Package Explorer”非正常显示,出现错误“Could not create the view: An unexpected excep ...

  6. setup in xunit

    https://xunit.github.io/docs/shared-context Shared Context between Tests It is common for unit test ...

  7. R语言学习笔记(4)

    第四章:基本数据管理 一 贯穿整章的示例 二 变量的创建.重编码和重命名 三 日期值与缺失值 四 数据类型和类型转换 五 数据集的排序.合并与取子集 一 贯穿整章的示例(leadership)  ,, ...

  8. Windows 安装Mysql8.0 绿色包

    〇.准备: MySQL8.0 Windows zip包下载地址:https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.11-winx64.zip 环 ...

  9. 天地图OGC WMTS服务规则

    图层名称 服务地址 投影类型 矢量底图 http://t0.tianditu.gov.cn/vec_c/wmts?tk=您的密钥 经纬度投影 http://t0.tianditu.gov.cn/vec ...

  10. cell 配置

    Cells Cell configuration options Configure the API (top-level) cell Configure the child cells Config ...