1. 全局变量:
    1 #include "stdafx.h"
  2. #include <windows.h>
  3.  
  4. /*BMP位图数据是4字节对齐*/
  5. #define WIDTHBYTES(bits) ((DWORD)(((bits)+31) & (~31)) / 8)
  6. #define WIDTHBYTES(bits) ((DWORD)((((bits)+31) / 32) * 4)
  7.  
  8. unsigned char *gPBmpBuf ; //指向图像数据的指针
  9. int gBmpWidth ; //图像的宽
  10. int gBmpHeight; //图像的高
  11. RGBQUAD *gPColorTable ; //颜色表指针
  12. int gBiBitCount; //图像类型,每个像素的位数
  13. char bmp[] = "E:/test_pic.bmp";
  14. char saveBmp[] = "E:/save_pic.bmp";

读取bmp文件:

  1. bool loadBmp(char *bmpName)
  2. {
  3. /*以二进制方式打开bmp文件*/
  4. FILE *fp = fopen(bmpName , "rb");
  5. if(NULL == fp)
  6. {
  7. printf("open file \"%s\" failed \n" , bmpName);
  8. return false ;
  9. }
  10.  
  11. /*跳过bmp文件结构体*/
  12. fseek(fp , sizeof(BITMAPFILEHEADER),);
  13.  
  14. /*读取bmp文件信息头*/
  15. BITMAPINFOHEADER infoHead ;
  16. fread(&infoHead , sizeof(BITMAPINFOHEADER), , fp);
  17.  
  18. /*获取图像宽,高,像素位数*/
  19. gBmpWidth = infoHead.biWidth ;
  20. gBmpHeight = infoHead.biHeight;
  21. gBiBitCount= infoHead.biBitCount;
  22.  
  23. /*获取每行像素所占内存大小(必须为4的倍数)*/
  24. int lineByte = (gBmpWidth*gBiBitCount/ + )/* ;
  25.  
  26. /*灰度图像有颜色表,且颜色表表项为256,24-位真彩色图像就不使用彩色板*/
  27. if( == gBiBitCount)
  28. {
  29. gPColorTable = (RGBQUAD *)malloc(sizeof(RGBQUAD)*);
  30. fread(gPColorTable , sizeof(RGBQUAD) , , fp);
  31. }
  32.  
  33. /*申请位图数据空间,并将位图数据存放到内存*/
  34. gPBmpBuf = (unsigned char *)malloc(sizeof(unsigned char)*gBmpHeight*lineByte);
  35. fread(gPBmpBuf, ,gBmpHeight*lineByte,fp);
  36.  
  37. fclose(fp);
  38.  
  39. return true ;
  40. }

保存bmp文件格式:

  1. bool storeBmp(char *bmpName , unsigned char *imgBuf , int width , int height,
  2. int gBiBitCount , RGBQUAD *gPColorTable )
  3. {
  4. /*对位图数据进行判空操作*/
  5. if(NULL == imgBuf)
  6. {
  7. return false ;
  8. }
  9.  
  10. /*根据像素位数,判断当前颜色表大小*/
  11. int colorTableSize = ;
  12. if(gBiBitCount == )
  13. {
  14. /*
  15. 1字节用于蓝色分量
  16. 1字节用于绿色分量
  17. 1字节用于红色分量
  18. 1字节用于填充符(设置为0)
  19. */
  20. colorTableSize = ; /*4*256*/
  21. }
  22.  
  23. /*待存储图像数据每行像素的大小(4的倍数)*/
  24. int lineByte = (gBmpWidth*gBiBitCount/ + )/* ;
  25.  
  26. FILE *fp = fopen(bmpName , "wb");
  27. if(NULL == fp)
  28. {
  29. printf("creat file failed !\n");
  30. return false ;
  31. }
  32.  
  33. /*填写位图文件头结构体*/
  34. BITMAPFILEHEADER fileHead ;
  35. fileHead.bfType = 0x4D42 ; //bmp类型
  36. fileHead.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
  37. colorTableSize + lineByte*height ;
  38. fileHead.bfReserved1 = ;
  39. fileHead.bfReserved2 = ;
  40. fileHead.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
  41. colorTableSize ;
  42. fwrite(&fileHead , sizeof(BITMAPFILEHEADER), , fp);
  43.  
  44. /*填写位图信息结构体*/
  45. BITMAPINFOHEADER infoHead ;
  46. infoHead.biBitCount = gBiBitCount ;
  47. infoHead.biClrImportant = ;
  48. infoHead.biClrUsed = ;
  49. infoHead.biCompression = ;
  50. infoHead.biHeight = height ;
  51. infoHead.biPlanes = ;
  52. infoHead.biSize = ;
  53. infoHead.biSizeImage = lineByte*height ;
  54. infoHead.biWidth = width ;
  55. infoHead.biXPelsPerMeter = ;
  56. infoHead.biYPelsPerMeter = ;
  57. fwrite(&infoHead , sizeof(BITMAPINFOHEADER), , fp);
  58.  
  59. /*填写颜色表*/
  60. if(gBiBitCount == )
  61. {
  62. fwrite(&gPColorTable , sizeof(RGBQUAD), , fp);
  63. }
  64.  
  65. /*写位图数据进文件*/
  66. fwrite( imgBuf, height * lineByte, , fp );
  67.  
  68. fclose(fp);
  69.  
  70. return true ;
  71. }

main入口测试:

  1. int _tmain(int argc, _TCHAR* argv[])
  2. {
  3.  
  4. bool ret = false ;
  5.  
  6. ret |= loadBmp(bmp);
  7. ret |= storeBmp(saveBmp,gPBmpBuf,gBmpWidth,gBmpHeight,gBiBitCount,gPColorTable);
  8.  
  9. if(false == ret)
  10. {
  11. printf("excut fail! \n");
  12. }
  13. else if(true == ret)
  14. {
  15. printf("excut success!\n");
  16. }
  17.  
  18. if(gBiBitCount == )
  19. {
  20. free(gPColorTable);
  21. }
  22.  
  23. free(gPBmpBuf);
  24.  
  25. return ;
  26. }

BMP格式图像读取与存储的更多相关文章

  1. [自制操作系统] BMP格式文件读取&图形界面系统框架/应用接口设计

    本文将介绍在本人JOS中实现的简单图形界面应用程序接口,应用程序启动器,以及一些利用了图形界面的示例应用程序. 本文主要涉及以下部分: 内核/用户RW/RW调色板framebuffer共享区域 8bi ...

  2. bmp格式图像的读写函数(对一个开源代码的封装)

    在网上看到一段读写bmp格式图像的代码,本文对这段代码分成两个函数封装起来方便使用,一个函数是读取bmp格式的图像,一个是向指定文件写入bmp格式的图像. 前提 我们不需要知道这段代码是如何读取bmp ...

  3. DICOM图像转出为bmp格式图像方法(matlab程序实现)

    在matlab中用dicomread读取dicom文件后,生成一个MxN矩阵(对应图像像素个数),每个像素灰度数据是int16格式 但是bmp图像灰度是int8格式的(灰度范围0~255),所以若想把 ...

  4. libTIFF 图像读取与保存

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/YhL_Leo/article/details/49848391 1 头文件 libtif ...

  5. MATLAB raw格式转为bmp格式

    今天是第一天写博客,哈哈哈!把完成的数字图像作业放上来和大家一起分享一下! 如果有什么问题,希望大家和我多多交流 1518234852@qq.com width=512; height=512; im ...

  6. 图像BMP格式介绍

    1 图像BMP格式说明 BMP是一种与硬件设备无关的图像文件格式,使用非常广.它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大.BMP文件的图像深度可选 ...

  7. 你所能用到的BMP格式介绍

    原理篇: 一.编码的意义. 让我们从一个简单的问题开始,-2&-255(中间的操作符表示and的意思)的结果是多少,这个很简单的问题,但是能够写出解答过程的人并不 多.这个看起来和图片格式没有 ...

  8. 在VC下显示JPEG、GIF格式图像的一种简便方法

    在VC下显示JPEG.GIF格式图像的一种简便方法 一. 引言  JPEG图像压缩标准随然是一种有损图像压缩标准,但由于人眼视觉的不敏感,经压缩后的画质基本没有发生变化,很快便以较高的压缩率得到了广泛 ...

  9. BMP格式介绍(一)

    原理篇: 一.编码的意义. 让我们从一个简单的问题开始,-2&-255(中间的操作符表示and的意思)的结果是多少,这个很简单的问题,但是能够写出解答过程的人并不 多.这个看起来和图片格式没有 ...

随机推荐

  1. 初次学习asp.net core的心得

    初次学习Asp.Net Core方面的东西,虽然研究的还不是很深,今天主要是学习了一下Asp.Net Core WebAPI项目的使用,发现与Asp.Net WebAPI项目还是有很多不同.不同点包含 ...

  2. Spring学习(3):IOC基础(转载)

    一. IoC是什么 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象 ...

  3. Linux内核学习笔记(7)--完全公平调度(CFS)

    一.完全公平调度算法 完全公平调度 CFS 的出发点基于一个简单的理念:进程调度的效果应该如同系统具备一个理想中的完美多任务处理器.在这种系统中,每个进程能够获得 1/n 的处理器时间(n 为可运行进 ...

  4. IT视频课程集(包含各类Oracle、DB2、Linux、Mysql、Nosql、Hadoop、BI、云计算、编程开发、网络、大数据、虚拟化

    马哥Linux培训视频课程:http://pan.baidu.com/s/1pJwk7dp Oracle.大数据系列课程:http://pan.baidu.com/s/1bnng3yZ 天善智能BI培 ...

  5. asp.net mvc 使用Ajax调用Action 返回数据【转】

      使用asp.net mvc 调用Action方法很简单. 一.无参数方法. 1.首先,引入jquery-1.5.1.min.js 脚本,根据版本不同大家自行选择. <script src=& ...

  6. mongoDB操作2

    一.find操作 MongoDB中使用find来进行查询,通过指定find的第一个参数可以实现全部和部分查询. 1.查询全部 空的查询文档{}会匹配集合的全部内容.如果不指定查询文档,默认就是{}. ...

  7. react native组件的创建

    react native组件的创建 react文件加载顺序: react项目启动后,先加载index.js.在index.js中可以指向首页. import { AppRegistry } from ...

  8. Linux中打开文件管理器的命令

    在Mac中,我们可以使用open命令,在终端打开指定目录下的文件管理器,在Linux中,同样可以使用类似的命令:nautilus.

  9. tomcat开发环境配置

    1.环境配置教程 环境变量.安装版.配置版 2.编写启动tomcat的批处理文件 3.改变端口 4.虚拟目录

  10. 【最小生成树+LCA】Imperial roads

    http://codeforces.com/gym/101889 I 先跑一遍最小生成树,把经过的边和答案记录下来 对于每个询问的边,显然如果处于MST中,答案不变 如果不在MST中,假设这条边连上了 ...