?? bcb_g3.htm
字號:
<html>
<head>
<title>BMP位圖文件結(jié)構(gòu)及平滑縮放</title>
<meta http-equiv="目錄類型" content="文本/html; 字符集=gb2312">
</head>
<body bgcolor="#FFFFFF">
<table width="100%" border="0" height="285">
<tr>
<td height="35">
<div align="center" class="p14"><font color="#000000">BMP位圖文件結(jié)構(gòu)及平滑縮放</font></div>
</td>
</tr>
<tr valign="top">
<td>
<p><font color=#ffffff>----</font> 用普通方法顯示BMP位圖,占內(nèi)存大,速度慢,在圖形縮小時,失真嚴(yán)重,在低顏色位數(shù)的設(shè)備上顯示高顏色位數(shù)的圖形圖形時失真大。本文采用視頻函數(shù)顯示BMP位圖,可以消除以上的缺點(diǎn)。
<p><font color=#ffffff>----</font> <b>一、BMP文件結(jié)構(gòu)</b>
<p><font color=#ffffff>----</font> 1. BMP文件組成
<p><font color=#ffffff>----</font> BMP文件由文件頭、位圖信息頭、顏色信息和圖形數(shù)據(jù)四部分組成。
<p><font color=#ffffff>----</font> 2. BMP文件頭
<p><font color=#ffffff>----</font> BMP文件頭數(shù)據(jù)結(jié)構(gòu)含有BMP文件的類型、文件大小和位圖起始位置等信息。
<p><font color=#ffffff>----</font> 其結(jié)構(gòu)定義如下:
<p>typedef struct tagBITMAPFILEHEADER<br>
{<br>
WORDbfType; // 位圖文件的類型,必須為BM<br>
DWORD bfSize; // 位圖文件的大小,以字節(jié)為單位<br>
WORDbfReserved1; // 位圖文件保留字,必須為0<br>
WORDbfReserved2; // 位圖文件保留字,必須為0<br>
DWORD bfOffBits; // 位圖數(shù)據(jù)的起始位置,以相對于位圖<br>
// 文件頭的偏移量表示,以字節(jié)為單位<br>
} BITMAPFILEHEADER;<br>
</p>
<font
color=#ffffff>----</font> 3. 位圖信息頭
<p><font color=#ffffff>----</font>
<p>BMP位圖信息頭數(shù)據(jù)用于說明位圖的尺寸等信息。<br>
typedef struct tagBITMAPINFOHEADER{<br>
DWORD biSize; // 本結(jié)構(gòu)所占用字節(jié)數(shù)<br>
LONGbiWidth; // 位圖的寬度,以像素為單位<br>
LONGbiHeight; // 位圖的高度,以像素為單位<br>
WORD biPlanes; // 目標(biāo)設(shè)備的級別,必須為1<br>
WORD biBitCount// 每個像素所需的位數(shù),必須是1(雙色),<br>
// 4(16色),8(256色)或24(真彩色)之一<br>
DWORD biCompression; // 位圖壓縮類型,必須是 0(不壓縮),<br>
// 1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一<br>
DWORD biSizeImage; // 位圖的大小,以字節(jié)為單位<br>
LONGbiXPelsPerMeter; // 位圖水平分辨率,每米像素數(shù)<br>
LONGbiYPelsPerMeter; // 位圖垂直分辨率,每米像素數(shù)<br>
DWORD biClrUsed;// 位圖實(shí)際使用的顏色表中的顏色數(shù)<br>
DWORD biClrImportant;// 位圖顯示過程中重要的顏色數(shù)<br>
} BITMAPINFOHEADER;<br>
</p>
<font
color=#ffffff>----</font> 4. 顏色表
<p><font color=#ffffff>----</font> 顏色表用于說明位圖中的顏色,它有若干個表項,每一個表項是一個RGBQUAD類型的結(jié)構(gòu),定義一種顏色。RGBQUAD結(jié)構(gòu)的定義如下:
<p>typedef struct tagRGBQUAD {<br>
BYTErgbBlue;// 藍(lán)色的亮度(值范圍為0-255)<br>
BYTErgbGreen; // 綠色的亮度(值范圍為0-255)<br>
BYTErgbRed; // 紅色的亮度(值范圍為0-255)<br>
BYTErgbReserved;// 保留,必須為0<br>
} RGBQUAD;<br>
顏色表中RGBQUAD結(jié)構(gòu)數(shù)據(jù)的個數(shù)有biBitCount來確定:<br>
當(dāng)biBitCount=1,4,8時,分別有2,16,256個表項;<br>
當(dāng)biBitCount=24時,沒有顏色表項。<br>
位圖信息頭和顏色表組成位圖信息,BITMAPINFO結(jié)構(gòu)定義如下:<br>
typedef struct tagBITMAPINFO {<br>
BITMAPINFOHEADER bmiHeader; // 位圖信息頭<br>
RGBQUAD bmiColors[1]; // 顏色表<br>
} BITMAPINFO;<br>
<br>
</p>
<font color=#ffffff>----</font> 5. 位圖數(shù)據(jù)
<p><font color=#ffffff>----</font> 位圖數(shù)據(jù)記錄了位圖的每一個像素值,記錄順序是在掃描行內(nèi)是從左到右,掃描行之間是從下到上。位圖的一個像素值所占的字節(jié)數(shù):
<p>當(dāng)biBitCount=1時,8個像素占1個字節(jié);<br>
當(dāng)biBitCount=4時,2個像素占1個字節(jié);<br>
當(dāng)biBitCount=8時,1個像素占1個字節(jié);<br>
當(dāng)biBitCount=24時,1個像素占3個字節(jié);<br>
Windows規(guī)定一個掃描行所占的字節(jié)數(shù)必須是<br>
4的倍數(shù)(即以long為單位),不足的以0填充,<br>
一個掃描行所占的字節(jié)數(shù)計算方法:<br>
DataSizePerLine= (biWidth* biBitCount+31)/8; <br>
// 一個掃描行所占的字節(jié)數(shù)<br>
DataSizePerLine= DataSizePerLine/4*4; // 字節(jié)數(shù)必須是4的倍數(shù)<br>
位圖數(shù)據(jù)的大小(不壓縮情況下):<br>
DataSize= DataSizePerLine* biHeight;<br>
</p>
<font color=#ffffff>----</font> <b>二、BMP位圖一般顯示方法</b>
<p><font color=#ffffff>----</font> 1. 申請內(nèi)存空間用于存放位圖文件
<p><font color=#ffffff>----</font> GlobalAlloc(GHND,F(xiàn)ileLength);
<p><font color=#ffffff>----</font> 2. 位圖文件讀入所申請內(nèi)存空間中
<p><font color=#ffffff>----</font> LoadFileToMemory( mpBitsSrc,mFileName);
<p><font color=#ffffff>----</font> 3. 在OnPaint等函數(shù)中用創(chuàng)建顯示用位圖
<p><font color=#ffffff>----</font> 用CreateDIBitmap()創(chuàng)建顯示用位圖,用CreateCompatibleDC()創(chuàng)建兼容DC,
<p><font color=#ffffff>----</font> 用SelectBitmap()選擇顯示位圖。
<p><font color=#ffffff>----</font> 4. 用BitBlt或StretchBlt等函數(shù)顯示位圖
<p><font color=#ffffff>----</font> 5. 用DeleteObject()刪除所創(chuàng)建的位圖
<p><font color=#ffffff>----</font> 以上方法的缺點(diǎn)是: 1)顯示速度慢; 2) 內(nèi)存占用大; 3) 位圖在縮小顯示時圖形失真大,(可通過安裝字體平滑軟件來解決);
4) 在低顏色位數(shù)的設(shè)備上(如256顯示模式)顯示高顏色位數(shù)的圖形(如真彩色)圖形失真嚴(yán)重。
<p><font color=#ffffff>----</font> <b>三、BMP位圖縮放顯示</b>
<p><font color=#ffffff>----</font> 用DrawDib視頻函數(shù)來顯示位圖,內(nèi)存占用少,速度快,而且還可以對圖形進(jìn)行淡化(Dithering)處理。淡化處理是一種圖形算法,可以用來在一個支持比圖像所用顏色要少的設(shè)備上顯示彩色圖像。BMP位圖顯示方法如下:
<p><font color=#ffffff>----</font> 1. 打開視頻函數(shù)DrawDibOpen(),一般放在在構(gòu)造函數(shù)中
<p><font color=#ffffff>----</font> 2. 申請內(nèi)存空間用于存放位圖文件
<p><font color=#ffffff>----</font> GlobalAlloc(GHND,F(xiàn)ileLength);
<p><font color=#ffffff>----</font> 3. 位圖文件讀入所申請內(nèi)存空間中
<p><font color=#ffffff>----</font> LoadFileToMemory( mpBitsSrc,mFileName);
<p><font color=#ffffff>----</font> 4. 在OnPaint等函數(shù)中用DrawDibRealize(),DrawDibDraw()顯示位圖
<p><font color=#ffffff>----</font> 5. 關(guān)閉視頻函數(shù)DrawDibClose(),一般放在在析構(gòu)函數(shù)中
<p><font color=#ffffff>----</font> 以上方法的優(yōu)點(diǎn)是: 1)顯示速度快; 2) 內(nèi)存占用少; 3) 縮放顯示時圖形失真小,4)
在低顏色位數(shù)的設(shè)備上顯示高顏色位數(shù)的圖形圖形時失真小; 5) 通過直接處理位圖數(shù)據(jù),可以制作簡單動畫。
<p><font color=#ffffff>----</font> <b>四、CViewBimap類編程要點(diǎn)</b>
<p><font color=#ffffff>----</font> 1. 在CViewBimap類中添加視頻函數(shù)等成員
<p>HDRAWDIB m_hDrawDib; // 視頻函數(shù)<br>
HANDLEmhBitsSrc; // 位圖文件句柄(內(nèi)存)<br>
LPSTR mpBitsSrc; // 位圖文件地址(內(nèi)存)<br>
BITMAPINFOHEADER *mpBitmapInfo; // 位圖信息頭<br>
</p>
<font color=#ffffff>----</font> 2. 在CViewBimap類構(gòu)造函數(shù)中添加打開視頻函數(shù)
<p><font color=#ffffff>----</font> m_hDrawDib= DrawDibOpen();
<p><font color=#ffffff>----</font> 3. 在CViewBimap類析構(gòu)函數(shù)中添加關(guān)閉視頻函數(shù)
<p>if( m_hDrawDib != NULL)<br>
{<br>
DrawDibClose( m_hDrawDib);<br>
m_hDrawDib = NULL;<br>
}<br>
</p>
<font
color=#ffffff>----</font> 4. 在CViewBimap類圖形顯示函數(shù)OnPaint中添加GraphicDraw()
<p>voidCViewBitmap::OnPaint()<br>
{<br>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -