【数字图像处理一】BMP图像的读取

原创 2015年07月07日 10:05:45

使用工具:VC6.0

实践具体操作:请参考《用MFC读取BMP图像》:http://blog.csdn.net/u013580497/article/details/44619869

该博文内容:如何编写读取和显示BMP图像的函数。

① 函数参数:

BOOL ReadImage(LPSTR ImageFileName, char *oImage) 
{	
}
调用方式:

ReadImage(ImgDlgFileName, OrgImage);
参数:

char ImgDlgFileName[]={"D:\\test.bmp"};//图像路径,注意必须是24位bmp图像,其它格式可以用画图另存为转成bmp。
char OrgImage[1024*1024];		//图像数据,获取RGB等信息
注意如果图片读取出来全是黑色的话,需要把1024*1024改大点,例如2048*2048。

② 建立变量

BOOL ReadImage(LPSTR ImageFileName, char *oImage) 
{	
	int r, g, b,j;
	OFSTRUCT of;
	HFILE Image_fp;//头文件
	BITMAPFILEHEADER BMFH;//文件头
	BITMAPINFOHEADER BMIH;//信息头
	Image_fp = OpenFile(ImageFileName, &of, OF_READ);//读取指定路径下的文件
	if (Image_fp == HFILE_ERROR)//判断读取图像的时候是否出错。 
	{	MessageBox(NULL, ImageFileName, "打开文件出错信息", MB_OK);
		return FALSE;
	}
}

OFSTRUCT of;负责从路径中读取出 HFILE Image_fp。

HFILE Image_fp 从BITMAP(BMP)图像中读取出 BITMAPFILEHEADER 和 BITMAPINFOHEADER。

BITMAPFILEHEADER 和 BITMAPINFOHEADER这两个类用于读取出24位BMP图像的信息。

BOOL ReadImage(LPSTR ImageFileName, char *oImage) 
{	
	///////////////////////   1.  建立变量   /////////////////////////////    
        int r, g, b,j;
	OFSTRUCT of;
	HFILE Image_fp;//头文件
	BITMAPFILEHEADER BMFH;//文件头
	BITMAPINFOHEADER BMIH;//信息头
	Image_fp = OpenFile(ImageFileName, &of, OF_READ);//读取指定路径下的文件
	if (Image_fp == HFILE_ERROR) 
	{	MessageBox(NULL, ImageFileName, "打开文件出错信息", MB_OK);
		return FALSE;
	}
        ///////////////////////// 2.  变量初始化  ///////////////////////////
      _lread(Image_fp, &BMFH,sizeof(BITMAPFILEHEADER));//初始化BITMAP FILE HEADER变量
      _lread(Image_fp,&BMIH,sizeof(BITMAPINFOHEADER));//初始化BITMAOP INFO HEADER变量}


③ 接下来可以用BITMAPFILEHEADER和BITMAPINFOHEADER读取出图像信息

BOOL ReadImage(LPSTR ImageFileName, char *oImage) 
{	
	///////////////////////   1.  建立变量   /////////////////////////////
        int r, g, b,j;
	OFSTRUCT of;
	HFILE Image_fp;//头文件
	BITMAPFILEHEADER BMFH;//文件头
	BITMAPINFOHEADER BMIH;//信息头
	Image_fp = OpenFile(ImageFileName, &of, OF_READ);//读取指定路径下的文件
	if (Image_fp == HFILE_ERROR) 
	{	MessageBox(NULL, ImageFileName, "打开文件出错信息", MB_OK);
		return FALSE;
	}
        ///////////////////////// 2.  变量初始化  ///////////////////////////
        _lread(Image_fp, &BMFH,sizeof(BITMAPFILEHEADER));//初始化BITMAP FILE HEADER变量
	_lread(Image_fp,&BMIH,sizeof(BITMAPINFOHEADER));//初始化BITMAOP INFO HEADER变量
        ////////////////////////  3.  读取图像的相关信息   //////////////////
        wImage=BMIH.biWidth;//指定图像的宽度,单位是像素
        hImage=BMIH.biHeight;//指定图像的高度,单位是像素
        biSizeImage=BMIH.biSizeImage;//图像的字节数
}

④ 读取BMP图像的全部RGB信息

首先要说明一点,BMP图像的内容并不全是图像内容,前面还有一点别的信息,例如宽度高度什么的,所以在读取BMP图像的时候要跳过这些信息。

例如用数组表示的话:


所以我们要使用:

_llseek(Image_fp,BMFH.bfOffBits,FILE_BEGIN);

来跳过开头信息。

BOOL ReadImage(LPSTR ImageFileName, char *oImage) 
{	
	///////////////////////   1.  建立变量   /////////////////////////////
        int r, g, b,j;
	OFSTRUCT of;
	HFILE Image_fp;//头文件
	BITMAPFILEHEADER BMFH;//文件头
	BITMAPINFOHEADER BMIH;//信息头
	Image_fp = OpenFile(ImageFileName, &of, OF_READ);//读取指定路径下的文件
	if (Image_fp == HFILE_ERROR) 
	{	MessageBox(NULL, ImageFileName, "打开文件出错信息", MB_OK);
		return FALSE;
	}
        ///////////////////////// 2.  变量初始化  ///////////////////////////
        _lread(Image_fp, &BMFH,sizeof(BITMAPFILEHEADER));//初始化BITMAP FILE HEADER变量
	_lread(Image_fp,&BMIH,sizeof(BITMAPINFOHEADER));//初始化BITMAOP INFO HEADER变量
        ////////////////////////  3.  读取图像的相关信息   //////////////////
       	wImage=BMIH.biWidth;//指定图像的宽度,单位是像素
	hImage=BMIH.biHeight;//指定图像的高度,单位是像素
        biSizeImage=BMIH.biSizeImage;//图像的字节数
        ////////////////////////  4.  读取BMP的RGB信息   ////////////////////
        _llseek(Image_fp,BMFH.bfOffBits,FILE_BEGIN);//BfOffBits  位图数据距文件头的偏移量
        _lread(Image_fp,oImage,biSizeImage);//往oImage写入RBG信息。
        _lclose(Image_fp);//关闭头文件
}
这样oImage数组就获得了图像的RGB信息。


⑤ 现在可以用oImage数组来输出图像了,不过为了方便编程我们可以编一个struct。

struct RGB{
	BYTE R;
	BYTE G;
	BYTE B;
};
这样就可以建一个RGB二维数组来,存储图像中每一块的RGB信息,然后知道图像的宽和高,就可以用循环来显示图像。

⑥ 把oImage转化成RGB[][]

    要注意的是:

我们通过 biSizeImage=BMIH.biSizeImage;获取了总字节数。

那么每一行的字节数就是BitRow=biSizeImage/hImage,其中hImage表示图像的高。

而部分图像中数组oImage中wImage*3 ≠ BitRow(wImage表示图像的高,*3表示RGB有三个),会造成图像倾斜。


所以每行都需要从BitRow * i 开始读取,i 表示当前行数。

<span style="font-size:14px;">BOOL ReadImage(LPSTR ImageFileName, char *oImage) 
{	
	///////////////////////   1.  建立变量   /////////////////////////////
	int r, g, b;
	OFSTRUCT of;
	HFILE Image_fp;//头文件
	BITMAPFILEHEADER BMFH;//文件头
	BITMAPINFOHEADER BMIH;//信息头
	Image_fp = OpenFile(ImageFileName, &of, OF_READ);//读取指定路径下的文件
	if (Image_fp == HFILE_ERROR) 
	{	MessageBox(NULL, ImageFileName, "打开文件出错信息", MB_OK);
		return FALSE;
	}
	///////////////////////// 2.  变量初始化  ///////////////////////////
	_lread(Image_fp, &BMFH,sizeof(BITMAPFILEHEADER));//初始化BITMAP FILE HEADER变量
	_lread(Image_fp,&BMIH,sizeof(BITMAPINFOHEADER));//初始化BITMAOP INFO HEADER变量
	////////////////////////  3.  读取图像的相关信息   //////////////////
	wImage=BMIH.biWidth;//指定图像的宽度,单位是像素
	hImage=BMIH.biHeight;//指定图像的高度,单位是像素
	biSizeImage=BMIH.biSizeImage;//图像的字节数
	////////////////////////  4.  读取BMP的RGB信息   /////////////////////
	_llseek(Image_fp,BMFH.bfOffBits,FILE_BEGIN);//BfOffBits  位图数据距文件头的偏移量
	_lread(Image_fp,oImage,biSizeImage);//往oImage写入RBG信息。
	_lclose(Image_fp);//关闭头文件
	////////////////////////  5.  将oImage转成RGB[][]  ///////////////////
	Imagebyte=new RGB*[hImage];//建立动态数组
	BitRow=biSizeImage/hImage;//  每一行的位图数据占用的字节数
	for(unsigned long i=0;i<hImage;i++){
		Imagebyte[i]=new RGB[wImage];//建立动态数组
		BitTheRow=i*BitRow;
		for (unsigned long j=0; j<wImage; j++) {
			r= (BYTE)(oImage[BitTheRow+j*3+2]);
			g= (BYTE)(oImage[BitTheRow+j*3+1]);
			b= (BYTE)(oImage[BitTheRow+j*3]);
			Imagebyte[i][j].R=r;
			Imagebyte[i][j].G=g;
			Imagebyte[i][j].B=b;
		}
	}
	return true;
}</span>

至此ReadImage的函数已经读取完毕。


接下来就是编写ShowImage的函数。

void ShowImage(int xPos,int yPos)
{	
	unsigned long i,j;
    for(i=0;i<hImage;i++){
		for(j=0;j<wImage;j++){
				//当hImage为整数的时候,Bmp图像是倒过来的,所以输出的时候要从最下面开始输出,方法是hImage-i。
			SetPixel(hWinDC,j+xPos,hImage-i+yPos,RGB(Imagebyte[i][j].R,Imagebyte[i][j].G,Imagebyte[i][j].B));
		}
	}
}
主要就是遍历一个hImage * wImage的二维数组。

根据RGB三基色绘制一个图块的函数:

SetPixel(当前窗口,X坐标,Y坐标,RGB(R值,G值,B值));
调用ShowImage函数后图像显示如下:



全局变量有:

HDC  hWinDC;//图像显示区域
unsigned long wImage=0,hImage=0;
int BitTheRow=0;
int BitRow=0;
int biSizeImage=0;
RGB **Imagebyte;
char ImgDlgFileName[]={"D:\\tree1.bmp"};
char OrgImage[1024*1024];		//图像数据

本案例下载地址:http://download.csdn.net/detail/u013580497/8876395

版权声明:本文为博主原创文章,未经博主允许不得转载。

C语言 BMP图片处理

http://feng88724.iteye.com/blog/316651   首页 资讯   精华   论坛   问答   博客   专栏   群组   更多 ▼   招聘搜索 您还未...
  • u012587637
  • u012587637
  • 2015年07月10日 14:12
  • 2442

数字图像处理常用BMP图片集合

  • 2014年11月05日 14:38
  • 2.29MB
  • 下载

【数字图像处理】一.MFC详解显示BMP格式图片

本文主要是讲述《数字图像处理》系列栏目中的文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的《数字图像处理》课程和以前的项目叙述讲解.从四个方面进行叙述:BMP图...
  • Eastmount
  • Eastmount
  • 2014年01月14日 19:31
  • 19446

c++读取bmp图片详解

先介绍几个会用到的函数。 1、FILE * fopen(const char * path,const char * mode); path是字符串类型的bmp图片路径;mode读取方式,等下...
  • u013509299
  • u013509299
  • 2014年12月01日 23:54
  • 8283

读取BMP文件并显示出来(C++实现)

读取BMP文件的时候我们首先需要弄清楚bmp格式文件的结构 bmp的文件格式 bmp文件包含在windows.h的头文件里。编写代码的时候可以直接调用Windows.h 头文件来调用。...
  • wobuzhidao8
  • wobuzhidao8
  • 2017年03月28日 16:15
  • 4223

C语言读取BMP格式图片

C语言读取BMP格式图片 BMP 维基百科,自由的百科全书 汉漢▼ 位图 扩展名 .bmp 开发者 ...
  • wsfdl
  • wsfdl
  • 2012年09月08日 10:06
  • 28616

用C语言进行BMP文件的读写

bmp是BitMap(位图)的简称,也是所有windows上图片显示的基础。所有的图片格式,都必须转换成bmp才能进行最终的显示。所以,bmp文件的读写,就变得非常重要了。然而,很多人是借助于MFC类...
  • carson2005
  • carson2005
  • 2012年05月29日 20:50
  • 24547

位图信息头BITMAPINFOHEADER

位图信息头BITMAPINFOHEADER,是一个结构,其定义如下typedef struct tagBITMAPINFOHEADER{ DWORD biSize; LONG biWi...
  • lsq19871207
  • lsq19871207
  • 2012年02月15日 10:56
  • 800

通过getPixel();和通过bmp.getPixels();方法遍历整张图片的效率比较。

如果要遍历一张图片的所有像素的(比如二值化),可以用两个for循环嵌套通过Bitmap中的getPixel(x,y)方法获取对应点的像素值即可。还有一种方法是通过Bitmap中的getPixels(p...
  • phlofy
  • phlofy
  • 2015年12月14日 13:07
  • 3323

对于一个".bmp"图片,获取其像素值的大小和个数

题目:对于一个".bmp"图片,获取其像素值的大小和个数 解析:废话不多说,直接上已经调试好的程序 #define _CRT_SECURE_NO_WARNINGS #include using...
  • yanxiaolx
  • yanxiaolx
  • 2016年11月22日 17:45
  • 3420
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【数字图像处理一】BMP图像的读取
举报原因:
原因补充:

(最多只允许输入30个字)