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这样的小工具)。