【无浪】用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;//用于存储实际的位图数据所占用的字节数
添加菜单栏编号。
第七步:
第八步:
或者是
相关文章推荐
- 在MFC中,不借用其他的库函数读取BMP图像,显示,也可以重新生成
- MFC学习(6)——以数组矩阵形式表示读取出来的BMP图像||将数组矩阵数据转成BMP图像
- java读取bmp图像文件
- 利用MFC和opencv读取视频显示图像方法
- 读取24位 BMP 图像并生成 JPG 缩略图
- MFC将bmp图像设为背景 接着是控件背景透明
- DCMTK学习之读取BMP图像里面的像素信息
- 图像识别 - C++读取bmp位图入门
- 图像识别-C++读取bmp位图入门
- bmp图像读取
- OpenCV+ MFC 对图像的读取、显示、保存
- VS2010+Opencv+MFC读取图像和视频显示在Picture控件
- vs2008 MFC程序 读取显示图像、更改背景图像
- 获取BMP图像的数据(以数组矩阵形式读取出来)&&将数组矩阵数据转成BMP图像
- VS2010+Opencv+MFC读取图像和视频显示在Picture控件
- MFC CImage 读取图像 像素
- VC/MFC读取BMP文件并显示
- C++读取、旋转和保存bmp图像文件编程实现
- C++ fstream读取bmp图像
- 获取BMP图像的数据(以数组矩阵形式读取出来)&&将数组矩阵数据转成BMP图像