天天看点

【无浪】用MFC读取BMP图像 大致情况如下:

大致情况如下:

【无浪】用MFC读取BMP图像 大致情况如下:

第一步:

【无浪】用MFC读取BMP图像 大致情况如下:

第二步:

【无浪】用MFC读取BMP图像 大致情况如下:

                                                                                       图  1-2

【无浪】用MFC读取BMP图像 大致情况如下:

第三步:

【无浪】用MFC读取BMP图像 大致情况如下:

                                                                                    图  1-3

第四步:

将代码添加到主函数的前面,代码如下:

/**
 * Time: 201503201823
 * BMIH.biWidth	              指定图像的宽度,单位是像素
 * BMIH.biHeight	          指定图像的高度,单位是像素
 * BMIH.biSizeImage	          实际的位图数据占用的字节数
 * BMIH.biSize	              指定这个结构的长度,为40
 * BMIH.biPlanes	          必须是1,不用考虑
 * BMIH.biBitCount	          指定表示颜色时要用到的位数
 * BMIH.biCompression	      指定位图是否压缩
 * BMIH.biXPelsPerMeter	      指定目标设备的水平分辨率
 * BMIH.biYPelsPerMeter	      指定目标设备的垂直分辨率
 * BMIH.biClrImportant	      图像中最重要的颜色数
 *
 * BMFH.bfType	              字节'BM'
 * BMFH.bfSize	              文件总字节数
 * BMFH.bfOffBits	          位图数据距文件头的偏移量
 *
 */
BOOL ReadImage(LPSTR ImageFileName, char *oImage) 
{	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;
	}
	//_llseek(Image_fp,0,0);//位图数据距文件头的偏移量
	_lread(Image_fp, &BMFH,sizeof(BITMAPFILEHEADER));
	_lread(Image_fp,&BMIH,sizeof(BITMAPINFOHEADER));
	wImage=BMIH.biWidth;//指定图像的宽度,单位是像素
	hImage=BMIH.biHeight;//指定图像的高度,单位是像素
	biSizeImage=BMIH.biSizeImage;//实际的位图数据占用的字节数
	_llseek(Image_fp,BMFH.bfOffBits,FILE_BEGIN);//BfOffBits  位图数据距文件头的偏移量
	_lread(Image_fp,oImage,biSizeImage);//往oImage读取所有信息
	_lclose(Image_fp);
	return TRUE;
}
void GetTheBlackBlock(char *Image){
	BlackBlock=(biSizeImage-wImage*hImage*3)/3;
	BitRow=biSizeImage/hImage;//  每一行的位图数据占用的字节数
}
void ShowImage(char *Image,int xPos,int yPos)
{	unsigned long i,j;
	//hImage-i:hImage->1,第i行的起点是在一维数组的 i / hImage * biSizeImage 下标。
	//然后RGB三个数据每个占一个数组空间,所以读取一行的RGB信息一次读取三个。
    for(i=0;i<hImage;i++){
		BitTheRow=i*BitRow;
		for(j=0;j<wImage;j++){
				//当hImage为整数的时候,Bmp图像是倒过来的,所以输出的时候要从最下面开始输出,方法是hImage-i。
			SetPixel(hWinDC,j+yPos,hImage-i+xPos,RGB(Image[BitTheRow+j*3+2],Image[BitTheRow+j*3+1],Image[BitTheRow+j*3]));
		}
	}
}
           

或者这个,两个都行

/**
 * Time: 201503201823
 * BMIH.biWidth	              指定图像的宽度,单位是像素
 * BMIH.biHeight	          指定图像的高度,单位是像素
 * BMIH.biSizeImage	          实际的位图数据占用的字节数
 * BMIH.biSize	              指定这个结构的长度,为40
 * BMIH.biPlanes	          必须是1,不用考虑
 * BMIH.biBitCount	          指定表示颜色时要用到的位数
 * BMIH.biCompression	      指定位图是否压缩
 * BMIH.biXPelsPerMeter	      指定目标设备的水平分辨率
 * BMIH.biYPelsPerMeter	      指定目标设备的垂直分辨率
 * BMIH.biClrImportant	      图像中最重要的颜色数
 *
 * BMFH.bfType	              字节'BM'
 * BMFH.bfSize	              文件总字节数
 * BMFH.bfOffBits	          位图数据距文件头的偏移量
 *
 */
BOOL ReadImage(LPSTR ImageFileName, char *oImage) 
{	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;
	}
	//_llseek(Image_fp,0,0);//位图数据距文件头的偏移量
	_lread(Image_fp, &BMFH,sizeof(BITMAPFILEHEADER));
	_lread(Image_fp,&BMIH,sizeof(BITMAPINFOHEADER));
	wImage=BMIH.biWidth;//指定图像的宽度,单位是像素
	hImage=BMIH.biHeight;//指定图像的高度,单位是像素
	biSizeImage=BMIH.biSizeImage;//实际的位图数据占用的字节数
	_llseek(Image_fp,BMFH.bfOffBits,FILE_BEGIN);//BfOffBits  位图数据距文件头的偏移量
	_lread(Image_fp,oImage,wImage*hImage*3);//IMAGEWIDTH*IMAGEHEIGHT表示这个BMP图像有这么多个小矩形,*3是RGB共三个值
	_lclose(Image_fp);
	return TRUE;
}
void ShowImage(char *Image,int xPos,int yPos)
{	unsigned long i,j;
	BitRow=biSizeImage/hImage;//  每一行的位图数据占用的字节数
	BlackBlock=(biSizeImage-wImage*hImage*3)/3;
	for(i=0;i<(hImage-BlackBlock/wImage-1);i++){
		//hImage-i:hImage->1,第i行的起点是在一维数组的 i / hImage * biSizeImage 下标。
		//然后RGB三个数据每个占一个数组空间,所以读取一行的RGB信息一次读取三个。
		BitTheRow=i*BitRow;
		for(j=0;j<wImage;j++){
			//当hImage为整数的时候,Bmp图像是倒过来的,所以输出的时候要从最下面开始输出,方法是hImage-i。
			SetPixel(hWinDC, j+yPos, hImage-i+xPos,  RGB(Image[BitTheRow+j*3+2],Image[BitTheRow+j*3+1],Image[BitTheRow+j*3]));
		}
	}
	for(j=0;j<(wImage-BlackBlock%wImage);j++){
		//COLORREF SetPixel(HDC hdc, int X, int Y, COLORREF crColor);
		SetPixel(hWinDC, j+yPos, hImage-i+xPos,  RGB(Image[BitTheRow+j*3+2],Image[BitTheRow+j*3+1],Image[BitTheRow+j*3]));
	}
}
           

第六步: 添加全局变量和宏定义

HDC  hWinDC;				//图像显示区域
char OrgImage[1024*1024];		//图像数据
unsigned long wImage,hImage,BlackBlock;
#define XPOS		100		//默认图像显示位置
#define YPOS		100
unsigned long biSizeImage,BitRow,BitTheRow;//用于存储实际的位图数据所占用的字节数
           

添加菜单栏编号。

【无浪】用MFC读取BMP图像 大致情况如下:

  第七步:

【无浪】用MFC读取BMP图像 大致情况如下:

第八步:

【无浪】用MFC读取BMP图像 大致情况如下:

或者是

【无浪】用MFC读取BMP图像 大致情况如下:

继续阅读