?? ddbase.htm
字號:
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">計算機中,一個字節(<font
FACE="Arial" SIZE="3">Byte</font>)是由<font FACE="Arial" SIZE="3">8</font>個位(<font
FACE="Arial" SIZE="3">Bit</font>)組成的。位深度指的是用來描述某狀態值所使用的計算機位的個數。在<font
FACE="Arial" SIZE="3">DirectDraw</font>中,通常用位深度來代表位圖中的顏色值所使用的位個數,從另一個意義上講,位深度表示了位圖中顏色的豐富程度。</p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><font FACE="Arial" SIZE="3"><p ALIGN="JUSTIFY">1</font>字節等于<font
FACE="Arial" SIZE="3">8</font>位二進制數,所以一字節所能表達的十進制整數的范圍是從<font
FACE="Arial" SIZE="3">0</font>到<font FACE="Arial" SIZE="3">255</font>,即一字節能且最多只能反映出<font
FACE="Arial" SIZE="3">256</font>(<font FACE="Arial" SIZE="3">2</font>的<font
FACE="Arial" SIZE="3">8</font>次方)種不同的狀態。在位圖中,如果用其中每一種狀態代表圖象中某一個點的顏色,那么最多可以得到<font
FACE="Arial" SIZE="3">256</font>種不同的顏色,這就是我們常見的<font
FACE="Arial" SIZE="3">8</font>位(<font FACE="Arial" SIZE="3">256</font>色)的位圖。同理,如果用<font
FACE="Arial" SIZE="3">1</font>位二進制數來表示某一點的顏色,那么只能得兩種(<font
FACE="Arial" SIZE="3">2</font>的<font FACE="Arial" SIZE="3">1</font>次方)顏色,這就是一幅兩位的黑白位圖;如果用四位二進制數則產生<font
FACE="Arial" SIZE="3">16</font>種顏色(<font FACE="Arial" SIZE="3">2</font>的<font
FACE="Arial" SIZE="3">4</font>次方),這是一幅<font FACE="Arial" SIZE="3">4</font>位(<font
FACE="Arial" SIZE="3">16</font>色)的位圖,用<font FACE="Arial" SIZE="3">24</font>位產生<font
FACE="Arial" SIZE="3">16M</font>種顏色(<font FACE="Arial" SIZE="3">2</font>的<font
FACE="Arial" SIZE="3">24</font>次方)等,這就是一幅<font FACE="Arial" SIZE="3">24</font>位真彩位圖。由于每幅圖形文件都用確定的位數來代表顏色(<font
FACE="Arial" SIZE="3">1</font>、<font FACE="Arial" SIZE="3">2</font>、<font FACE="Arial"
SIZE="3">4</font>、<font FACE="Arial" SIZE="3">8</font>、<font FACE="Arial" SIZE="3">16</font>、<font
FACE="Arial" SIZE="3">24</font>或<font FACE="Arial" SIZE="3">32</font>位),所以我們所見的圖片顏色數都為<font
FACE="Arial" SIZE="3">2</font>的<font FACE="Arial" SIZE="3">n</font>次方(<font
FACE="Arial" SIZE="3">n=</font>位深度)。</p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">顯然,一幅圖象的位深度越高,那么它所能表現的顏色也越多,色彩也就越豐富。通常,在一般情況下,<font
FACE="Arial" SIZE="3">8</font>位(<font FACE="Arial" SIZE="3">256</font>色)的圖片已可滿足需要,但在一些要求高質量圖象的場合,<font
FACE="Arial" SIZE="3">16</font>或<font FACE="Arial" SIZE="3">24</font>位的圖象是必須的。當然,顏色位深度的增加,也勢必帶來所需存儲空間的膨脹,沒有經過壓縮的相同大小的<font
FACE="Arial" SIZE="3">24</font>位圖象所需的存儲空間是<font FACE="Arial"
SIZE="3">8</font>位圖象的<font FACE="Arial" SIZE="3">3</font>倍,這也會帶來文件讀取和操作速度的降低,所以在需要高速度顯示圖象的場合,使用低位深度的圖象是必要的。</p>
</font><hr>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><b><p><a name="5、抖動處理(Dithering)">5、抖動處理(Dithering)</a></p>
</b><p align="right"></font><font size="3"><a href="#目錄">返回目錄</a></font><font
FACE="宋體" SIZE="3"></p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">在低位深度的圖象中,由于顏色總數的限制,有些顏色無法顯示出來,為了模擬出那些顏色以提高顯示效果,廣泛采用了一種稱作抖動處理(<font
FACE="Arial" SIZE="3">dithering</font>)的方法,也稱半色調處理(<font
FACE="Arial" SIZE="3">Halftoning</font>)。它是指用交替的點圖案去模擬在圖象中不能使用的顏色的過程。單色圖象是最簡單的格式,一般由黑色和白色組成,在一些單色圖象如黑白照片和有深淺的圖案中,會使用各種灰度,這種圖象常被稱為灰度圖象<font
FACE="Arial" SIZE="3">(Grayscale Image)</font>。由于人眼會把一個很細致的黑白相間的圖案解釋成灰色,所以灰度圖象也可使用單色文件格式,數據仍然可以是黑和白。使用黑色或某一種單色的點獲得連續的該色灰度的過程就是抖動處理。抖動處理被更多的用在那些低位數彩色圖象文件中,與不采用這種處理相比,它具有更好的顯示效果。</p>
</font><hr>
</blockquote>
<blockquote>
<b><font face="宋體"><font FACE="宋體" SIZE="3"><p></font><a
name="6、調色板(Palette)"><font size="3">6、</font></font><font FACE="宋體"
SIZE="3">調色板(<font FACE="Arial">Palette)</font></a></b></p>
<p align="right"></font><font size="3"><a href="#目錄">返回目錄</a></font><font
FACE="宋體" SIZE="3"></p>
</font>
</blockquote>
<font FACE="宋體" SIZE="3">
<blockquote>
<p ALIGN="JUSTIFY">顯示器及顯示卡與顯示器的接口都采用模擬方式來處理色彩,因此,它們都具有幾乎無限的色彩顯示和傳輸能力,但主機和顯示卡只能用數字方式來表示和處理色彩,在用數字方式表示色彩時,如果要獲得更豐富,更細膩的色彩就需要增加色彩的位深度,這就需要更大容量的顯示存儲器,相應的也就需要更高的處理速度,同時分辨率的提高也對顯示存儲器的容量提出了很高的要求。</p>
</blockquote>
<blockquote>
<p ALIGN="JUSTIFY">為了盡量降低對顯存的需求,在<font FACE="Arial" SIZE="3">Windows</font>中可以使用一種間接的色彩表示方法,這就是調色板(<font
FACE="Arial" SIZE="3">Palette</font>)表示法。它的含義是:用一個顏色索引(<font
FACE="Arial" SIZE="3">Color Index</font>)來代表各個像素點的顏色,而不是直接用紅,綠,藍三基色的亮度值來確定每個像素點的顏色。色彩表(<font
FACE="Arial" SIZE="3">Color table</font>)是一個包含了若干顏色索引和該索引所對應的真實顏色值的表,這個色彩表就是調色板。</p>
</blockquote>
<blockquote>
<b><p ALIGN="JUSTIFY"></b>這種方法就好比給學校里的每一個學生規定一個專用的學號,在很多場合,并不需要知道某個同學的實際姓名,只要知道他的學號即可,顯而易見,使用學號無疑會給學校的學員管理工作帶來了極大的便利。調色板就好比一張記載了學生學號及其姓名的名冊,顏色索引值就是學生的學號,<font
FACE="Arial" SIZE="3">RGB</font>顏色值就是學生的姓名。</p>
</blockquote>
<blockquote>
<p ALIGN="JUSTIFY">使用調色板的好處就在于:索引值占用較少的數據位<font
FACE="Arial" SIZE="3">(1</font>、<font FACE="Arial" SIZE="3">2</font>、<font
FACE="Arial" SIZE="3">4</font>或<font FACE="Arial" SIZE="3">8</font>位<font FACE="Arial"
SIZE="3">)</font>,而真實顏色值占用較長的數據位<font FACE="Arial" SIZE="3">(24</font>位,即<font
FACE="Arial" SIZE="3">3</font>字節,分別代表紅,綠,藍三基色的顏色亮度值,從<font
FACE="Arial" SIZE="3">0</font>到<font FACE="Arial" SIZE="3">255)</font>。由于使用了調色板,既提高了圖象顯示效率,又減少了對顯存的需求。</p>
</blockquote>
<blockquote>
<p ALIGN="JUSTIFY">調色板的顏色索引主要采用<font FACE="Arial" SIZE="3">4</font>或<font
FACE="Arial" SIZE="3">8</font>兩種位深度:<font FACE="Arial" SIZE="3">4</font>位位深度可有<font
FACE="Arial" SIZE="3">16</font>種不同取值,對應于顯示器的<font FACE="Arial"
SIZE="3">16</font>色顯示模式,這時一屏最多只能顯示<font FACE="Arial"
SIZE="3">16</font>種不同的顏色;<font FACE="Arial" SIZE="3">8</font>位位深度可有<font
FACE="Arial" SIZE="3">256</font>種不同的取值,對應于顯示器的<font
FACE="Arial" SIZE="3">256</font>色顯示模式,一屏最多只能顯示<font
FACE="Arial" SIZE="3">256</font>種顏色。于是,問題就開始出現了,當你在<font
FACE="Arial" SIZE="3">16</font>色模式下顯示一幅<font FACE="Arial" SIZE="3">256</font>色或更高位深度的的圖象時,你將會看到本應色彩鮮艷的圖片變得面目全飛,罪魁禍首就是調色板,由于它使得同時顯示在屏幕上的不同顏色最多只能有<font
FACE="Arial" SIZE="3">16</font>種(對應于<font FACE="Arial" SIZE="3">16</font>色模式下),于是<font
FACE="Arial" SIZE="3">Windows</font>首先從圖象中挑選了<font FACE="Arial" SIZE="3">16</font>種使用頻率最高的顏色指定給調色板,對于所有其它的顏色,從調色板中挑選一個最接近的顏色顯示出來。在<font
FACE="Arial" SIZE="3">256</font>色模式下,要同時顯示兩幅不同調色板的<font
FACE="Arial" SIZE="3">256</font>色位圖時,也會發生這種圖象失真的情況。<b></p>
</b><hr>
</blockquote>
<blockquote>
<b><p></font><a name="7、GDI與DirectDraw"><font FACE="Arial" SIZE="3">7</font><font
size="3">、</font><font FACE="Arial" SIZE="3">GDI</font><font FACE="宋體" SIZE="3"><font
FACE="宋體">與</font><font FACE="Arial">DirectDraw</a></p>
</font></b><p align="right"><font size="3"><a href="#目錄">返回目錄</a></font></p>
</blockquote>
<blockquote>
<b><p ALIGN="JUSTIFY"></b>在大多數的<font FACE="Arial" SIZE="3">Windows</font>編程中,開發者們使用的是<font
FACE="Arial" SIZE="3">Win32</font>的函數以獲得訪問繪圖頁面的能力,例如,使用<font
FACE="Arial" SIZE="3">GetDC</font>函數,可以獲得設備環境(<font FACE="Arial"
SIZE="3">DC</font>?/FONT><font FACE="Arial" SIZE="3">Device context</font>)。在獲得設備環境之后,你就可以開始進行對屏幕的繪圖了。<font
FACE="Arial" SIZE="3">Win32</font>的所有圖形函數都是由<font FACE="Arial"
SIZE="3">Windows</font>系統的一個獨立完整的模塊所提供,這就是圖形設備接口(<font
FACE="Arial" SIZE="3">GDI</font>?/FONT><font FACE="Arial" SIZE="3">Graphics device
interface</font>)。<font FACE="Arial" SIZE="3">GDI</font>為計算機用戶和計算機硬件之間提供了一個抽象層,在此層的基礎上,用戶可以通過簡單的調用<font
FACE="Arial" SIZE="3">Win32</font>的圖形函數進行圖形顯示。</p>
</blockquote>
<blockquote>
<font FACE="Arial" SIZE="3"><p ALIGN="JUSTIFY">GDI</font>的一大缺憾就是,它不是為具有高表現力的多媒體軟件和游戲而設計的,設計者們開發它的主要用途是運行商業應用軟件諸如:<font
FACE="Arial" SIZE="3">Word</font>字處理軟件、<font FACE="Arial" SIZE="3">Excel</font>電子表格、<font
FACE="Arial" SIZE="3">Explorer</font>瀏覽器等。<font FACE="Arial" SIZE="3">GDI</font>只提供了訪問系統主存的能力,而不提供直接訪問顯存的能力,并不能從具有某些加速特性的顯卡中獲得其優良特性。簡而言之,<font
FACE="Arial" SIZE="3">GDI</font>對絕大多數的商業軟件來說是相當完美的,但對于多媒體軟件和游戲來說,它卻是低速和低效的。</p>
</blockquote>
<blockquote>
<p ALIGN="JUSTIFY">另一方面,<font FACE="Arial" SIZE="3">DirectDraw</font>可以提供給開發者代表了真實顯示內存的繪圖頁面。這意味著,只要你使用了<font
FACE="Arial" SIZE="3">DirectDraw</font>,你就可以直接操縱顯卡上的內存,圖形顯示變得出奇的快速。而且這些頁面代表了顯存中連續的內存塊,使得在頁面中尋址和讀寫變得非常方便。</p>
<hr>
</blockquote>
<blockquote>
<b><p><a name="8、位塊傳送(Blit)">8、位塊傳送(<font FACE="Arial">Blit</font><font
FACE="宋體">)</font></a></p>
</b><p align="right"><font size="3"><a href="#目錄">返回目錄</a></font></p>
</blockquote>
<blockquote>
<p ALIGN="JUSTIFY">“<font FACE="Arial" SIZE="3">Blit</font>”是“<font FACE="Arial"
SIZE="3">Bit block transfer</font>”的縮寫,意為“位塊傳送”。顧名思義,<font
FACE="Arial" SIZE="3">Blit</font>的作用是:將某一內存塊的數據傳送到另一內存塊,前一內存塊被稱為“源”,后一內存塊被稱為“目標”。這里用的是“傳送”一詞,而不是“復制”,因為在<font
FACE="Arial" SIZE="3">Blit</font>過程中,數據并不是被原封不動的轉移,而是經過了一定的轉換。</p>
</blockquote>
<blockquote>
<ul>
<li><font color="#FF0000">在許多書籍中或程序中經常可以見到的“Bitblt”、“Blt"或“Bltting”,其實也是同一個意思,前者讀作['bitb'lit];后者讀作[b'lit]。</font></li>
</ul>
</blockquote>
<blockquote>
<p ALIGN="JUSTIFY">在絕大多數情況下,<font FACE="Arial" SIZE="3">Blit</font>操作是針對位圖圖象的,因此,源數據代表的是“源位圖”,目標數據代表的就是“目標位圖”。圖象程序開發者使用<font
FACE="Arial" SIZE="3">Blit</font>的函數在內存中將某頁面上的一幅位圖經過一定的變換轉移到另一個頁面上。這種變換有很多種,每一種都有一個代碼與之對應,我們稱該代碼為光柵操作代碼(<font
FACE="Arial" SIZE="3">ROP</font>?/FONT>Raster operation code)。</p>
</blockquote>
<blockquote>
<p ALIGN="JUSTIFY">Blit操作被廣泛的用于圖形程序中,如在顯示位圖、移動、復制位圖、位圖合成、位圖特效以及精靈的實現中都有blit的身影。GDI和DirectDraw中,都提供了blit的函數,如GDI中的BitBlt、StretchBlt、PatBlt等,DirectDraw中的IDirectDrawSurface3::Blt和IDirectDrawSurface3::BltFast等。</p>
</blockquote>
<blockquote>
<p ALIGN="JUSTIFY">下面我們來分析一個典型的Blit的函數,GDI的BitBlt是Win32
API中一個重要的函數,關于它的詳細資料可以參閱VC中的幫助,位于:Platform,SDK,and
DDK Document\Platform SDK\Reference\Functions\Win32 Functions,它的原型如下:<font
FACE="宋體" SIZE="3" COLOR="#ff0000"></p>
</font>
</blockquote>
</font>
<blockquote>
<font FACE="Arial" SIZE="1"><p
style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2px"></font><font
color="#FFFFFF">BOOL BitBlt(</font></p>
<p
style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2px"><font
color="#FFFFFF">HDC hdcDest, //目標設備環境的句柄</font></p>
<p
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -