BMP格式图像读取与存储
全局变量:
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格式图像读取与存储的更多相关文章
- [自制操作系统] BMP格式文件读取&图形界面系统框架/应用接口设计
本文将介绍在本人JOS中实现的简单图形界面应用程序接口,应用程序启动器,以及一些利用了图形界面的示例应用程序. 本文主要涉及以下部分: 内核/用户RW/RW调色板framebuffer共享区域 8bi ...
- bmp格式图像的读写函数(对一个开源代码的封装)
在网上看到一段读写bmp格式图像的代码,本文对这段代码分成两个函数封装起来方便使用,一个函数是读取bmp格式的图像,一个是向指定文件写入bmp格式的图像. 前提 我们不需要知道这段代码是如何读取bmp ...
- DICOM图像转出为bmp格式图像方法(matlab程序实现)
在matlab中用dicomread读取dicom文件后,生成一个MxN矩阵(对应图像像素个数),每个像素灰度数据是int16格式 但是bmp图像灰度是int8格式的(灰度范围0~255),所以若想把 ...
- libTIFF 图像读取与保存
本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/YhL_Leo/article/details/49848391 1 头文件 libtif ...
- MATLAB raw格式转为bmp格式
今天是第一天写博客,哈哈哈!把完成的数字图像作业放上来和大家一起分享一下! 如果有什么问题,希望大家和我多多交流 1518234852@qq.com width=512; height=512; im ...
- 图像BMP格式介绍
1 图像BMP格式说明 BMP是一种与硬件设备无关的图像文件格式,使用非常广.它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大.BMP文件的图像深度可选 ...
- 你所能用到的BMP格式介绍
原理篇: 一.编码的意义. 让我们从一个简单的问题开始,-2&-255(中间的操作符表示and的意思)的结果是多少,这个很简单的问题,但是能够写出解答过程的人并不 多.这个看起来和图片格式没有 ...
- 在VC下显示JPEG、GIF格式图像的一种简便方法
在VC下显示JPEG.GIF格式图像的一种简便方法 一. 引言 JPEG图像压缩标准随然是一种有损图像压缩标准,但由于人眼视觉的不敏感,经压缩后的画质基本没有发生变化,很快便以较高的压缩率得到了广泛 ...
- BMP格式介绍(一)
原理篇: 一.编码的意义. 让我们从一个简单的问题开始,-2&-255(中间的操作符表示and的意思)的结果是多少,这个很简单的问题,但是能够写出解答过程的人并不 多.这个看起来和图片格式没有 ...
随机推荐
- 用Micro:bit做床头灯
这是一个非常简单的项目,给孩子们介绍感应和控制,使用光敏电阻LDR作为光线传感器和床头灯的LED. 这也介绍了模拟输入的概念.数字输入为ON或OFF.只有0和1两种可能的条件.仿真输入是一系列可能值中 ...
- PHP性能优化 -实战篇
借助xhprof 工具分析PHP性能 XHPorf(源自Fackbook 的PHP性能分析工具) 实战 通过分析Wordpress程序,做优化! 优化 找到需要优化的函数 grep 'impo ...
- [寒假学习笔记](二)Python初学
Python 学习 python的自学从几个月前断断续续地进行,想好好利用这个寒假,好好地学一学. 回顾 已学习:基本操作.函数 已有C++的一定基础,只要注意python中比较特殊的部分就行 进入正 ...
- New begin
Purpose 今天更换了id,希望重新沉淀. 晚上看到国外一个博客,落款有个中文: 敬惜字纸. 共勉.
- 0428数字口袋精灵app优化
"数字口袋精灵app"优化 目录: 一.项目github总仓库推送 二.开发成员 三.分工与合作 四.各模块成果 五.团队成员贡献分 内容: 一.项目github总仓库: http ...
- 20181120-4 Beta阶段第2周/共2周 Scrum立会报告+燃尽图 01
此作业要求参见https://edu.cnblogs.com/campus/nenu/2018fall/homework/2409 版本控制地址 https://git.coding.net/lg ...
- 2017年软件工程第八次作业-互评Alpha版本
B.Thunder——爱阅app(测评人:方铭) 一.基于NABCD评论作品,及改进建议 每个小组评论其他小组Alpha发布的作品:1.根据(不限于)NABCD评论作品的选题:2.评论作品对选题的实现 ...
- 冲刺ing-4
第四次Scrum冲刺 队员完成的任务 队员 完成任务 吴伟华 Leangoo的看板截图,燃尽图 蔺皓雯 编写博客,学习后端设计 蔡晨旸 学习后端设计 曾茜 后端设计 鲁婧楠 服务器建构 杨池宇 学习后 ...
- C语言的知识与能力的自评
1.我希望将来上班的地方是自己所感兴趣的,正在寻找自己感兴趣的,并且正在普及IT行业的相关知识. 2.我认为学习就是一个自我成长和自我提升以及认识世界的方法,学习的作用是可以不断的提升对这个世界的认识 ...
- 将java开发的wordcount程序提交到spark集群上运行
今天来分享下将java开发的wordcount程序提交到spark集群上运行的步骤. 第一个步骤之前,先上传文本文件,spark.txt,然用命令hadoop fs -put spark.txt /s ...