大致情况如下:
第一步:
第二步:
图 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;//用于存储实际的位图数据所占用的字节数
添加菜单栏编号。
第七步:
第八步:
或者是