天天看點

【無浪】用MFC讀取BMP圖像 大緻情況如下:

大緻情況如下:

【無浪】用MFC讀取BMP圖像 大緻情況如下:

第一步:

【無浪】用MFC讀取BMP圖像 大緻情況如下:

第二步:

【無浪】用MFC讀取BMP圖像 大緻情況如下:

                                                                                       圖  1-2

【無浪】用MFC讀取BMP圖像 大緻情況如下:

第三步:

【無浪】用MFC讀取BMP圖像 大緻情況如下:

                                                                                    圖  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讀取BMP圖像 大緻情況如下:

第八步:

【無浪】用MFC讀取BMP圖像 大緻情況如下:

或者是

【無浪】用MFC讀取BMP圖像 大緻情況如下:

繼續閱讀