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的意思)的结果是多少,这个很简单的问题,但是能够写出解答过程的人并不 多.这个看起来和图片格式没有 ...
随机推荐
- idea 模版之自定义类与方法注释
idea 模版之自定义类与方法注释 很多公司都有要求的代码注释规范,我们每新建类或者方法的时候从新复制粘贴很麻烦,而且容易粘错. 当然自定义模板还可以用到很多地方,比如系统自带的 sout就是syst ...
- JavaScript学习笔记(二)——函数和数组
第二章 函数简介 1 第一个函数示例 <script language="JavaScript" type="text/JavaScript"> f ...
- django项目中关于跨域CORS
1.使用django-cors-headers扩展,但首先进行安装 2.在配置中添加应用 3.在中间层中设置:“corsheaders.middleware.CorsMiddleware” 4.添加C ...
- nginx upstream 名称下划线问题
原始配置: user nobody;worker_processes 1; #pid logs/nginx.pid; worker_connections 1024;} http ...
- php json 转换
在PHP语言中使用JSON 作者: 阮一峰 日期: 2011年1月14日 目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它. 我写过一篇<数据类型和JSON格式& ...
- Java中的网络编程-3
用户数据协议(UDP)是网络信息传输的另外一种形式, 基于UDP的通信不同于基于TCP的通信, 基于UDP的信息传递更快, 但是不提供可靠的保证. 使用UDP传输数据时, 用户无法知道数据能否正确地到 ...
- Windows Forms编程实战学习:第二章 欢迎使用Visual Studio
第二章 欢迎使用Visual Studio 1,AssemblyInfo文件 包含程序集的属性,向应用程序添加元数据 [assembly:<attribute>(<setting&g ...
- JAVA方法的重载(overload)和覆盖(override)
方法的重载(overload)和覆盖(override) 有的时候,类的同一种功能有多种实现方式,到底采用哪种实现方式,取决于调用者给定的参数.例如我们最常用的System.out.println() ...
- JarvisOJ平台Web题部分writeup
PORT51 题目链接:http://web.jarvisoj.com:32770/ 这道题本来以为是访问服务器的51号端口,但是想想又不太对,应该是本地的51号端口访问服务器 想着用linux下的c ...
- LR监控apache服务器
开启mod_status模块功能,在LR的controller中找到apache资源图双击并右键添加度量,如下图: 添加apache服务器IP地址.选择系统平台.添加需要监控的计数器即可进行 ...