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

读取bmp文件:

 bool loadBmp(char *bmpName)
{
/*以二进制方式打开bmp文件*/
FILE *fp = fopen(bmpName , "rb");
if(NULL == fp)
{
printf("open file \"%s\" failed \n" , bmpName);
return false ;
} /*跳过bmp文件结构体*/
fseek(fp , sizeof(BITMAPFILEHEADER),); /*读取bmp文件信息头*/
BITMAPINFOHEADER infoHead ;
fread(&infoHead , sizeof(BITMAPINFOHEADER), , fp); /*获取图像宽,高,像素位数*/
gBmpWidth = infoHead.biWidth ;
gBmpHeight = infoHead.biHeight;
gBiBitCount= infoHead.biBitCount; /*获取每行像素所占内存大小(必须为4的倍数)*/
int lineByte = (gBmpWidth*gBiBitCount/ + )/* ; /*灰度图像有颜色表,且颜色表表项为256,24-位真彩色图像就不使用彩色板*/
if( == gBiBitCount)
{
gPColorTable = (RGBQUAD *)malloc(sizeof(RGBQUAD)*);
fread(gPColorTable , sizeof(RGBQUAD) , , fp);
} /*申请位图数据空间,并将位图数据存放到内存*/
gPBmpBuf = (unsigned char *)malloc(sizeof(unsigned char)*gBmpHeight*lineByte);
fread(gPBmpBuf, ,gBmpHeight*lineByte,fp); fclose(fp); return true ;
}

保存bmp文件格式:

 bool storeBmp(char *bmpName , unsigned char *imgBuf , int width , int height,
int gBiBitCount , RGBQUAD *gPColorTable )
{
/*对位图数据进行判空操作*/
if(NULL == imgBuf)
{
return false ;
} /*根据像素位数,判断当前颜色表大小*/
int colorTableSize = ;
if(gBiBitCount == )
{
/*
1字节用于蓝色分量
1字节用于绿色分量
1字节用于红色分量
1字节用于填充符(设置为0)
*/
colorTableSize = ; /*4*256*/
} /*待存储图像数据每行像素的大小(4的倍数)*/
int lineByte = (gBmpWidth*gBiBitCount/ + )/* ; FILE *fp = fopen(bmpName , "wb");
if(NULL == fp)
{
printf("creat file failed !\n");
return false ;
} /*填写位图文件头结构体*/
BITMAPFILEHEADER fileHead ;
fileHead.bfType = 0x4D42 ; //bmp类型
fileHead.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
colorTableSize + lineByte*height ;
fileHead.bfReserved1 = ;
fileHead.bfReserved2 = ;
fileHead.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
colorTableSize ;
fwrite(&fileHead , sizeof(BITMAPFILEHEADER), , fp); /*填写位图信息结构体*/
BITMAPINFOHEADER infoHead ;
infoHead.biBitCount = gBiBitCount ;
infoHead.biClrImportant = ;
infoHead.biClrUsed = ;
infoHead.biCompression = ;
infoHead.biHeight = height ;
infoHead.biPlanes = ;
infoHead.biSize = ;
infoHead.biSizeImage = lineByte*height ;
infoHead.biWidth = width ;
infoHead.biXPelsPerMeter = ;
infoHead.biYPelsPerMeter = ;
fwrite(&infoHead , sizeof(BITMAPINFOHEADER), , fp); /*填写颜色表*/
if(gBiBitCount == )
{
fwrite(&gPColorTable , sizeof(RGBQUAD), , fp);
} /*写位图数据进文件*/
fwrite( imgBuf, height * lineByte, , fp ); fclose(fp); return true ;
}

main入口测试:

 int _tmain(int argc, _TCHAR* argv[])
{ bool ret = false ; ret |= loadBmp(bmp);
ret |= storeBmp(saveBmp,gPBmpBuf,gBmpWidth,gBmpHeight,gBiBitCount,gPColorTable); if(false == ret)
{
printf("excut fail! \n");
}
else if(true == ret)
{
printf("excut success!\n");
} if(gBiBitCount == )
{
free(gPColorTable);
} free(gPBmpBuf); return ;
}

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. File Transfer(并查集)

    题目大意:将多个电脑通过网线连接起来,不断查询2台电脑之间是否连通. 问题来源:中国大学mooc 05-树8 File Transfer (25 分) We have a network of com ...

  2. Qt 链接报错 version `Qt_5' not found

    问题: 在Ubuntu 上发布软件包的时候,复制链接库的时候出现Qt 版本找不到的情况: ./libqxcb.so: /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so ...

  3. leetcode个人题解——#33 Search in Rotated Sorted Array

    思路:每次取中间元素,一定有一半有序,另一半部分有序,有序的部分进行二分查找,部分有序的部分递归继续处理. class Solution { public: ; int middleSearch(in ...

  4. 腾讯视频qlv格式转换MP4普通视频方法

    QLV格式视频不是那么好对付的,似乎是一种加密格式,试着把.qlv改成.mp4或.flv都没有用,用格式工厂等转换软件转换也根本无法识别.但这并不意味着没有办法,其实真正的方法是不用任何工具: 1,我 ...

  5. ThinkPHP - 6 - 学习笔记(2015.5.4)

    解决:OneThink 站点无法被友言uyan后台识别 打开友言uyan插件功能,但OneThink站点无法被友言uyan后台检测到.页面生成的uyan代码为: <!-- UY BEGIN -- ...

  6. Scrum立会报告+燃尽图(十一月十四日总第二十二次):分配β阶段任务

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...

  7. Fiveplus--王者光耀1

    **光耀101** 汇总博客: 关文涛: 博客地址:随笔1 随笔2 杨蓝婷: 博客地址:随笔1 随笔2 蔡雅菁: 博客地址:随笔1 随笔2 黄森敏: 博客地址:随笔1 随笔2 林兴源: 博客地址:随笔 ...

  8. 奥特曼小分队之we are a team

    团队名称:奥特曼小分队 团队博客链接:http://cnblogs.com/ATMXFD 团队负责跑腿的:李全清 http://www.cnblogs.com/QuanQingli/ 团队成员: 孙乐 ...

  9. (一)java数据类型图

    ┏数值型━┳━整数型:byte short int long               ┏基本数据类型━━┫              ┗━浮点型:float double              ...

  10. Java JVM多线程