您的位置:首页 > 其它

【无浪】用MFC读取BMP图像

2015-03-25 12:03 302 查看


大致情况如下:



第一步:



第二步:



图 1-2



第三步:



图 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;//用于存储实际的位图数据所占用的字节数

添加菜单栏编号。



第七步:



第八步:



或者是

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: