正在加载图片...
BITMAPINFOHEADER bi BOOL Load Bmp File(HWNd hWnd, char*BmpFileName) HFILE hf,∥文件句柄 ∥指向 BITMAPINFOHEADER结构的指针 LPBITMAPINFOHEADER Iplmg Data LOGPALETTE *pPal;∥指向逻辑调色板结构的指针 LPRGBQUAD IpRGB,∥指向 RGBQUAD结构的指针 HPALETTE hPrey palette;∥来保存设备中原来的调色板 HDC hDc,∥设备句柄 HLOCAL hPa,∥存储调色板的局部内存句柄 DWORD LineBytes,∥每一行的字节数 DWORD Imgsize,∥实际的图象数据占用的字节数 ∥实际用到的颜色数,即调色板数组中的颜色个数 DWORD Num Colors if(hf- lopen(BmpFileName, OF READ))=HFILE ERROR) Message Box(hWnd, " File c: Itest. bmp not found! " "Error Message!" MB OKJMB ICONEXCLAMATION) return False;/打开文件错误,返回 ∥将 BITMAPFILEHEADER结构从文件中读出,填写到bf中 Iread(hf, (LPSTR)&bf, sizeof( BI TMAPFILEHEADER)) ∥将 BITMAPINFOHEADER结构从文件中读出,填写到bi中 Iread(hf, (LPSTR)&bi, sizeof(BITMAPINFOHEADER)) ∥我们定义了一个宏# define Widthy tes(i)(+31)/32*4)上面曾经 ∥提到过,每一行的字节数必须是4的整倍数,只要调用 ZIDTHBYTES( bi biTwidth*bi. biBit Count就能完成这一换算。举一个例 ∥子,对于2色图,如果图象宽是31,则每一行需要31位存储,合3个 ∥字节加7位,因为字节数必须是4的整倍数,所以应该是4,而此时的 / bi width=31 bi BitCount=1, WIDTHBYTES(31*1)=4,和我们设想的一样 ∥举一个256色的例子,如果图象宽是31,则每一行需要31个字节存 ∥储,因为字节数必须是4的整倍数,所以应该是32,而此时的 / bitwidth=31, bi Bitcount=8, WIDTHBYTES(31*8)=32,我们设想的一样。你 ∥以多举几个例子来验证一下 LineBytes为每一行的字节数 Line Bytes=(DWORD)WIDTHBYTES(bibi Width* bi. biBitCount); ImgSize为实际的图象数据占用的字节数BITMAPINFOHEADER bi; BOOL LoadBmpFile (HWND hWnd,char *BmpFileName) { HFILE hf; //文件句柄 //指向 BITMAPINFOHEADER 结构的指针 LPBITMAPINFOHEADER lpImgData; LOGPALETTE *pPal; //指向逻辑调色板结构的指针 LPRGBQUAD lpRGB; //指向 RGBQUAD 结构的指针 HPALETTE hPrevPalette; //用来保存设备中原来的调色板 HDC hDc; //设备句柄 HLOCAL hPal; //存储调色板的局部内存句柄 DWORD LineBytes; //每一行的字节数 DWORD ImgSize; //实际的图象数据占用的字节数 //实际用到的颜色数 ,即调色板数组中的颜色个数 DWORD NumColors; DWORD i; if((hf=_lopen(BmpFileName,OF_READ))==HFILE_ERROR){ MessageBox(hWnd,"File c:\\test.bmp not found!","Error Message", MB_OK|MB_ICONEXCLAMATION); return FALSE; //打开文件错误,返回 } //将 BITMAPFILEHEADER 结构从文件中读出,填写到 bf 中 _lread(hf,(LPSTR)&bf,sizeof(BITMAPFILEHEADER)); //将 BITMAPINFOHEADER 结构从文件中读出,填写到 bi 中 _lread(hf,(LPSTR)&bi,sizeof(BITMAPINFOHEADER)); //我们定义了一个宏 #define WIDTHBYTES(i) ((i+31)/32*4)上面曾经 //提到过,每一行的字节数必须是 4 的整倍数,只要调用 //WIDTHBYTES(bi.biWidth*bi.biBitCount)就能完成这一换算。举一个例 //子,对于 2 色图,如果图象宽是 31,则每一行需要 31 位存储,合 3 个 //字节加 7 位,因为字节数必须是 4 的整倍数,所以应该是 4,而此时的 //biWidth=31,biBitCount=1,WIDTHBYTES(31*1)=4,和我们设想的一样。 //再举一个 256 色的例子,如果图象宽是 31,则每一行需要 31 个字节存 //储,因为字节数必须是 4 的整倍数,所以应该是 32,而此时的 //biWidth=31,biBitCount=8,WIDTHBYTES(31*8)=32,我们设想的一样。你可 //以多举几个例子来验证一下 //LineBytes 为每一行的字节数 LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount); //ImgSize 为实际的图象数据占用的字节数
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有