全局变量:
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. Hbase 教程-安装

    HBase安装 安装前设置 安装Hadoop在Linux环境下之前,需要建立和使用Linux SSH(安全Shell).按照下面设立Linux环境提供的步骤. 创建一个用户 首先,建议从Unix创建一 ...

  2. org.apache.poi版本问题

    问题描述: 今天跑一段历史代码,发现不能启动,抛出java.lang.NoSuchFieldError: RETURN_NULL_AND_BLANK 问题 解决办法: 把org.apache.poi的 ...

  3. 动态语言的灵活性是把双刃剑 -- 以 Python 语言为例

    本文有些零碎,总题来说,包括两个问题:(1)可变对象(最常见的是list dict)被意外修改的问题,(2)对参数(parameter)的检查问题.这两个问题,本质都是因为动态语言(动态类型语言)的特 ...

  4. selenium--判断元素是否存在

    # coding:utf-8from selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitf ...

  5. webpack入门指南-step01

    一.webpack是什么? web开发中常用到的静态资源主要有JavaScript.CSS.图片.Jade等文件,webpack中将静态资源文件称之为模块.webpack是一个模块打包工具(命令行工具 ...

  6. 关于css文字的扩展

    1.不换行: .title{ white-space:nowrap; text-overflow:ellipsis; } 2.超出变三点 .title{ white-space:nowrap; tex ...

  7. Java 通过先序中序序列生成二叉树

    题目 二叉树的前序以及后续序列,以空格间隔每个元素,重构二叉树,最后输出二叉树的三种遍历方式的序列以验证. 输入: 1 2 3 4 5 6 7 8 9 10 3 2 5 4 1 7 8 6 10 9 ...

  8. 2016-2017 ACM-ICPC Northeastern European Regional Contest Problem E. Expect to Wait

    题目来源:http://codeforces.com/group/aUVPeyEnI2/contest/229509 时间限制:2s 空间限制:512MB 题目大意: 在一个车站中有若干人在队列中等待 ...

  9. Codeforces Round #272 (Div. 2) E. Dreamoon and Strings dp

    题目链接: http://www.codeforces.com/contest/476/problem/E E. Dreamoon and Strings time limit per test 1 ...

  10. Markdown的基本语法

    Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的语法十分简单.常用的标记符号也不 ...