大緻情況如下:
第一步:
第二步:
圖 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;//用于存儲實際的位圖資料所占用的位元組數
添加菜單欄編号。
第七步:
第八步:
或者是