bmp格式图像的读写函数(对一个开源代码的封装)
在网上看到一段读写bmp格式图像的代码,本文对这段代码分成两个函数封装起来方便使用,一个函数是读取bmp格式的图像,一个是向指定文件写入bmp格式的图像。
前提
我们不需要知道这段代码是如何读取bmp格式图像的,不需要知道bmp格式的图像时如何存储的,我们只需要知道有三个参数可以确定图像的尺寸大小,他们是图像的宽度、高度、通道数(例如灰度图像有一个通道,rgb图像有三个通道(rgb))。图像包含高度X宽度个像素,每个像素有相同的通道,他们在内存中按照一定的顺序存储,例如三通道bmp图像,在内存中图像行存储,第一个像素存储图像左下角的像素,第二个像素存储图像左下角向右移动一个单位后的像素,依次类推。
读图像操作
函数定义如下:
bool abReadImage(int &rows, int &cols, int &nChannels, io_byte *&imData, const char *imFileName)
{
imData = NULL;
int err_code=0;
try {
int n;
bmp_in in;
if ((err_code = bmp_in__open(&in,imFileName)) != 0)
throw err_code;
cols = in.cols; rows = in.rows; nChannels = in.num_components;
io_byte *dp;
imData = new io_byte[cols*rows*nChannels];
for (dp=imData, n=rows; n > 0; n--, dp+=cols*nChannels)
if ((err_code = bmp_in__get_line(&in,dp)) != 0)
throw err_code;
bmp_in__close(&in);
}
catch (int exc) {
if (exc == IO_ERR_NO_FILE)
fprintf(stderr,"Cannot open input file <%s>.\n", imFileName);
else if (exc == IO_ERR_FILE_HEADER)
fprintf(stderr,"Error encountered while parsing BMP file header.\n");
else if (exc == IO_ERR_UNSUPPORTED)
fprintf(stderr,"Input uses an unsupported BMP file format.\n Current "
"simple example supports only 8-bit and 24-bit data.\n");
else if (exc == IO_ERR_FILE_TRUNC)
fprintf(stderr,"Input file <%s> truncated unexpectedly.\n", imFileName);
else if (exc == IO_ERR_FILE_NOT_OPEN)
fprintf(stderr,"Trying to access a file which is not open!(?)\n");
return false;
}
return true;
}
使用此函数必须要包含头文件:io_bmp.h,这个头文件以及他声明的函数或者类型的实现可以在这里下载到。
读图像函数输入:
imFileName:输入图像的文件名。
读图像函数输出:
rows:图像的行数,或者说图像的高度。
cols:图像的列数,或者说图像的宽度。
nChannels:图像的通道数(1或者3,暂时不支持其他的通道)。
imData:存储图像像素的数组,注意,这个数组的内存是在函数内部申请的,在使用完图像后,记得释放掉这块内存。
写图像操作
函数定义如下:
bool abWriteImage(const int rows, const int cols, const int nChannels, io_byte *imData, const char *imFileName)
{
int err_code=0;
try {
bmp_out out;
if ((err_code = bmp_out__open(&out,imFileName,cols,rows,nChannels)) != 0)
throw err_code;
io_byte *dp;
int n;
for (dp=imData, n=rows; n > 0; n--, dp+=cols*nChannels)
bmp_out__put_line(&out,dp);
bmp_out__close(&out);
}
catch (int exc) {
if (exc == IO_ERR_NO_FILE)
fprintf(stderr,"Cannot open the output file <%s>.\n", imFileName);
else if (exc == IO_ERR_FILE_HEADER)
fprintf(stderr,"Error encountered while parsing BMP file header.\n");
else if (exc == IO_ERR_UNSUPPORTED)
fprintf(stderr,"Input uses an unsupported BMP file format.\n Current "
"simple example supports only 8-bit and 24-bit data.\n");
else if (exc == IO_ERR_FILE_TRUNC)
fprintf(stderr,"output file <%s> truncated unexpectedly.\n", imFileName);
else if (exc == IO_ERR_FILE_NOT_OPEN)
fprintf(stderr,"Trying to access a file which is not open!(?)\n");
return false;
}
return true;
}
使用此函数必须要包含头文件:io_bmp.h,这个头文件以及他声明的函数或者类型的实现可以在这里下载到。
写图像函数输入:
imFileName:要写入磁盘的图像文件名。
rows:图像的行数,或者说图像的高度。
cols:图像的列数,或者说图像的宽度。
nChannels:图像的通道数(1或者3,暂时不支持其他的通道)。
imData:存储图像像素的数组。
实验说明
根据你使用的编译相关工具不同,给出几点说明:
1、MSVS。 在你使用这两个函数的项目中要添加你下载的io_bmp.h和io_bmp.cpp。这是比较简单的一种使用方法。
2、如果你在linux上编译。记得将你下载的两个文件加入到你的工程中,还要记得对文件的格式进行下转换(可以使用dos2unix这样的小工具)。
bmp格式图像的读写函数(对一个开源代码的封装)的更多相关文章
- DICOM图像转出为bmp格式图像方法(matlab程序实现)
在matlab中用dicomread读取dicom文件后,生成一个MxN矩阵(对应图像像素个数),每个像素灰度数据是int16格式 但是bmp图像灰度是int8格式的(灰度范围0~255),所以若想把 ...
- BMP格式图像读取与存储
全局变量: 1 #include "stdafx.h" #include <windows.h> /*BMP位图数据是4字节对齐*/ #define WIDTHBYTE ...
- MATLAB raw格式转为bmp格式
今天是第一天写博客,哈哈哈!把完成的数字图像作业放上来和大家一起分享一下! 如果有什么问题,希望大家和我多多交流 1518234852@qq.com width=512; height=512; im ...
- 【Python笔记】2020年7月30日练习【python用input函数输入一个列表】
练习课题链接:廖雪峰-Python教程-高级特性-迭代 学习记录: 1.Python当中类似于 三目运算符 的应用 2.Python用input函数输入一个列表 代码实例:对用户输入的一组数字转化成l ...
- 图像BMP格式介绍
1 图像BMP格式说明 BMP是一种与硬件设备无关的图像文件格式,使用非常广.它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大.BMP文件的图像深度可选 ...
- linux编程 fmemopen函数打开一个内存流 使用FILE指针进行读写访问
fmemopen()函数打开一个内存流,使你可以读取或写入由buf指定的缓冲区.其返回FILE*fp就是打开的内存流,虽然仍使用FILE指针进行访问,但其实并没有底层文件(并没有磁盘上的实际文件,因为 ...
- 在VC下显示JPEG、GIF格式图像的一种简便方法
在VC下显示JPEG.GIF格式图像的一种简便方法 一. 引言 JPEG图像压缩标准随然是一种有损图像压缩标准,但由于人眼视觉的不敏感,经压缩后的画质基本没有发生变化,很快便以较高的压缩率得到了广泛 ...
- [自制操作系统] BMP格式文件读取&图形界面系统框架/应用接口设计
本文将介绍在本人JOS中实现的简单图形界面应用程序接口,应用程序启动器,以及一些利用了图形界面的示例应用程序. 本文主要涉及以下部分: 内核/用户RW/RW调色板framebuffer共享区域 8bi ...
- MFC中显示 .bmp格式的位图
最近在看VisualC++ 图像处理的书籍,表示一直在从基础做起,今天就记录一个简单功能的实现,显示.bmp格式的位图. 首先需要理解的是窗口创建的过程包括两个步骤:首先擦除窗口的背景,然后在对窗口进 ...
随机推荐
- js switch判断 三目运算 while 及 属性操作
三 目运算:如var a = 10: var b= 12: c = a>b ?a:b; 若成立执行a否则执行b var isHide = true; 若用if判断语句如下 if(isHide) ...
- 实验吧_NSCTF web200&FALSE(代码审计)
挺简单的一个代码审计,这里只要倒序解密就行了,这里给一下python版的wp import codecs import base64 strs = 'a1zLbgQsCESEIqRLwuQAyMwLy ...
- Linux提示字符设置
当我们登陆linux后,显示的提示字符究竟是什么意思呢?又可不可以设置呢. 首先来看看默认的显示: 普通用户: [fuwh@localhost ~]$ root用户: [root@localhost ...
- [POI2016]Nim z utrudnieniem
Description A和B两个人玩游戏,一共有m颗石子,A把它们分成了n堆,每堆石子数分别为a[1],a[2],...,a[n],每轮可以选择一堆石子,取掉任意颗石子,但不能不取.谁先不能操作,谁 ...
- [HNOI2012]永无乡
题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...
- 洛谷P3164 [CQOI2014]和谐矩阵
高斯消元,可以直接消的 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cst ...
- HNOI2002 营业额统计(Splay Tree)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 题意: Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并 ...
- [Educational Codeforces Round#22]
来自FallDream的博客,未经允许,请勿转载,谢谢. 晚上去clj博客逛来逛去很开心,突然同学提醒了一下,发现cf已经开始40分钟了,慌的一B,从B题开始写,写完了B到E最后收掉了A,结果太着急B ...
- C语言程序设计第二次作业0
(一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 include int mian() { printf(&q ...
- Linux学习之CentOS(十三)-----磁盘管理之 磁盘与目录的容量(转) df 与du 命令
磁盘与目录的容量 现在我们知道磁盘的整体数据是在 superblock 区块中,但是每个各别文件的容量则在 inode 当中记载的. 那在文字接口底下该如何叫出这几个数据呢?底下就让我们来谈一谈这两个 ...