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的意思)的结果是多少,这个很简单的问题,但是能够写出解答过程的人并不 多.这个看起来和图片格式没有 ...
随机推荐
- 初次学习asp.net core的心得
初次学习Asp.Net Core方面的东西,虽然研究的还不是很深,今天主要是学习了一下Asp.Net Core WebAPI项目的使用,发现与Asp.Net WebAPI项目还是有很多不同.不同点包含 ...
- Spring学习(3):IOC基础(转载)
一. IoC是什么 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象 ...
- Linux内核学习笔记(7)--完全公平调度(CFS)
一.完全公平调度算法 完全公平调度 CFS 的出发点基于一个简单的理念:进程调度的效果应该如同系统具备一个理想中的完美多任务处理器.在这种系统中,每个进程能够获得 1/n 的处理器时间(n 为可运行进 ...
- IT视频课程集(包含各类Oracle、DB2、Linux、Mysql、Nosql、Hadoop、BI、云计算、编程开发、网络、大数据、虚拟化
马哥Linux培训视频课程:http://pan.baidu.com/s/1pJwk7dp Oracle.大数据系列课程:http://pan.baidu.com/s/1bnng3yZ 天善智能BI培 ...
- asp.net mvc 使用Ajax调用Action 返回数据【转】
使用asp.net mvc 调用Action方法很简单. 一.无参数方法. 1.首先,引入jquery-1.5.1.min.js 脚本,根据版本不同大家自行选择. <script src=& ...
- mongoDB操作2
一.find操作 MongoDB中使用find来进行查询,通过指定find的第一个参数可以实现全部和部分查询. 1.查询全部 空的查询文档{}会匹配集合的全部内容.如果不指定查询文档,默认就是{}. ...
- react native组件的创建
react native组件的创建 react文件加载顺序: react项目启动后,先加载index.js.在index.js中可以指向首页. import { AppRegistry } from ...
- Linux中打开文件管理器的命令
在Mac中,我们可以使用open命令,在终端打开指定目录下的文件管理器,在Linux中,同样可以使用类似的命令:nautilus.
- tomcat开发环境配置
1.环境配置教程 环境变量.安装版.配置版 2.编写启动tomcat的批处理文件 3.改变端口 4.虚拟目录
- 【最小生成树+LCA】Imperial roads
http://codeforces.com/gym/101889 I 先跑一遍最小生成树,把经过的边和答案记录下来 对于每个询问的边,显然如果处于MST中,答案不变 如果不在MST中,假设这条边连上了 ...