【无浪】用MFC读取BMP图像

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-31 23:06   227   0

大致情况如下:


第一步:


第二步:


图 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;//用于存储实际的位图数据所占用的字节数
添加菜单栏编号。
第七步:


第八步:


或者是


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP