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

时间: 2024-10-13 06:22:37

bmp格式图像的读写函数(对一个开源代码的封装)的相关文章

Mat 图像和 BMP格式图像的相互转换

目录 一.前言 二.Mat 和 BMP 数据结构 三.转换实现思路 四.Mat 转 BMP 五.BMP转Mat 六.一点体会 一.前言 ? 格式转换很常见,其实在我实现了 Mat 转 BMP 之后才发现原来 imwrite 接口可以直接将 Mat 数据保存为 .bmp图像,不过下文所谈及的转换是在内存中的转换,因为将图像发送给识别服务器时显然不能先将 Mat 保存为 .bmp 文件,然后再读该文件以二进制形式发送给识别服务,而是应该直接在内存中完成其转换. 二.Mat 和 BMP 数据结构 Ma

一个开源项目的想法

最近因为受到工作上的启发,还有Konrad先生的框架的启发,想要自己动手写一个javascript的框架. 现在设想的框架是mvc模型,纯javascript,加上一些预定义css界面元素.面向Cordova端移动应用开发. 名字叫XJ框架 计划: 现在这里建立一个开源代码库 有空就进行初步架构的开发 稳定代码

数字图像处理 CImage类的使用与封装(jpg png gif tif bmp等格式图像的加载、数据读写、保存等功能)

引入CImage类的原因 原有的CBitmap 类只能处理BMP格式的图片,非常受限.而CImage可以处理JPGE.GIF.BMP.PNG等多种格式图片,扩展了图片处理功能且能与CBitmap 进行转换( 因为所载入的位图句柄都是HBITMAP,所以可相互转换),因此引入CImage类进行图像处理. CImage类简介 CImage是MFC和ATL共享的新类,它能从外部磁盘中调入一个JPEG.GIF.BMP和PNG格式的图像文件加以显示,而且这些文件格式可以相互转换. CImage提供增强型的

图像BMP格式介绍

1 图像BMP格式说明 BMP是一种与硬件设备无关的图像文件格式,使用非常广.它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大.BMP文件的图像深度可选lbit.4bit.8bit及24bit.BMP文件存储数据时,图像的扫描方式是按从左到右.从下到上的顺序. 由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式. 2 图像BMP文件结构以及结构说明 典型的BMP图像

在VC下显示JPEG、GIF格式图像的一种简便方法

在VC下显示JPEG.GIF格式图像的一种简便方法 一. 引言  JPEG图像压缩标准随然是一种有损图像压缩标准,但由于人眼视觉的不敏感,经压缩后的画质基本没有发生变化,很快便以较高的压缩率得到了广泛的认可.GIF格式虽然仅支持256色但它对于颜色较少的图像有着很高的压缩率,甚至超过JPEG标准,也得到了广泛的认同.但作为众多程序员的一个重要的开发工具--Microsoft Visual C++ 6.0的MFC库却仅对没有经过任何压缩的BMP位图文件有着良好的支持,可以读取.显示.存储甚至在内存

MFC中显示 .bmp格式的位图

最近在看VisualC++ 图像处理的书籍,表示一直在从基础做起,今天就记录一个简单功能的实现,显示.bmp格式的位图. 首先需要理解的是窗口创建的过程包括两个步骤:首先擦除窗口的背景,然后在对窗口进行重新绘制. 一般而言,对于单文档或多文档的MFC程序,显示图像的代码要放在OnDraw函数之中.刚刚说过,窗口重绘时,要先将窗口的背景擦除,也就是发送WM_ERASEBKGND消息,然后用OnEraseBkgnd()函数处理这个消息,所以我们的显示图像的代码也可以放在这个函数之中.当然,这里只是为

bmp格式解析

最近一直在写图像处理的作业,好多啊 bmp格式简介 a.格式组成 1:位图头文件数据结构,它包含BMP图像文件的类型.显示内容等信息: 2:位图信息数据结构,它包含有BMP图像的宽.高.压缩方法,以及定义 颜色等信息: 3:调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真 彩色图(24位的BMP)就不需要调色板: 4:位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位 图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值. b.对应数据结构 BMP文件头(

BMP格式详解

BMP格式详解 BMP文件格式详解(BMP file format) BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式.由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源.Windows的图形用户界面(graphical user interfaces)也在它的内建图像子系统GDI中对BMP格式提供了支持. 下面以Notepad++为分析工具,结合

BMP格式介绍(一)

原理篇: 一.编码的意义. 让我们从一个简单的问题开始,-2&-255(中间的操作符表示and的意思)的结果是多少,这个很简单的问题,但是能够写出解答过程的人并不 多.这个看起来和图片格式没有关系的问题恰恰是图片格式的核心内容以至于整个计算机系统的核心内容,多媒体技术虽然没有数据结构,操作系统等计算机基础课 所占的地位重,但是在于研究编码方面有着非常重要的地位.图像其实可以看做一种特殊编码过的文件. 二.从简单的24位bmp开始 bmp是最常见也是编码方式最简单的图片格式,这里不说明一幅图片是怎