對(duì)于DIB的輸出方式
發(fā)表時(shí)間:2024-06-18 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]DIB,設(shè)備無(wú)關(guān)位圖。既然設(shè)備無(wú)關(guān)了,我們要輸出它就有了一些困難,畢竟在屏幕上能看到的都是設(shè)備場(chǎng)景中的圖像。那么要怎樣輸出它呢?1、半隨機(jī)顯示——SetDIBitsToDevice是的,該API實(shí)現(xiàn)的輸出是半隨機(jī)化的。簡(jiǎn)單的說(shuō),用這個(gè)函數(shù)輸出的圖片我們能夠看到,但是它是不會(huì)被保存的,即使在VB中開(kāi)...
DIB,設(shè)備無(wú)關(guān)位圖。既然設(shè)備無(wú)關(guān)了,我們要輸出它就有了一些困難,畢竟在屏幕上能看到的都是設(shè)備場(chǎng)景中的圖像。那么要怎樣輸出它呢?
1、半隨機(jī)顯示——SetDIBitsToDevice
是的,該API實(shí)現(xiàn)的輸出是半隨機(jī)化的。簡(jiǎn)單的說(shuō),用這個(gè)函數(shù)輸出的圖片我們能夠看到,但是它是不會(huì)被保存的,即使在VB中開(kāi)啟了AutoRedraw也一樣。根據(jù)我的猜想,這個(gè)函數(shù)的實(shí)際功能非常簡(jiǎn)單,將一幅圖片畫到一個(gè)設(shè)備場(chǎng)景所在的區(qū)域,設(shè)置不經(jīng)過(guò)這個(gè)hDC本身的管理。
那么根據(jù)現(xiàn)象以及由現(xiàn)象推出的本質(zhì),這個(gè)函數(shù)對(duì)我們來(lái)說(shuō)只有一個(gè)優(yōu)點(diǎn):性能較高。但實(shí)際使用中的現(xiàn)象并非如此,該函數(shù)輸出一幅640x480的位圖平均需要6ms左右,如果你使用過(guò)Bitblt函數(shù),你會(huì)發(fā)現(xiàn),這個(gè)操作的效率是如此之低,甚至不如設(shè)備場(chǎng)景間的圖片傳遞。這是為什么?原因很簡(jiǎn)單,DIB的轉(zhuǎn)換。的確,SetDIBitsToDevice是直接將圖像畫到hDC中,但是這個(gè)過(guò)程卻一定要把DIB的數(shù)據(jù)轉(zhuǎn)換成hDC兼容的格式(就是hDC的圖片格式本身),然后再繪出。所以要提高SetDIBitsToDevice的執(zhí)行性能,首先你創(chuàng)建的位圖最好符合你預(yù)期要輸出到的hDC的格式。
P.S.我很奇怪這個(gè)函數(shù)為什么要這樣設(shè)計(jì),因?yàn)樗遣荒鼙4娓淖兊,即使用在打印hDC中也不能使得輸出內(nèi)容被打印出來(lái)。這個(gè),希望有高手來(lái)解答了。
2、穩(wěn)定化輸出:CreateDIBitmap
這個(gè)函數(shù)簡(jiǎn)單得多。你給出一個(gè)DIB,他負(fù)責(zé)把內(nèi)容copy下來(lái),然后“封裝”為一個(gè)hBitmap對(duì)象。你可以使用任何你想得到的方法對(duì)這個(gè)對(duì)象進(jìn)行處理,根據(jù)我的實(shí)驗(yàn),多數(shù)都是成功的。
不過(guò)千萬(wàn)不要妄想使用這個(gè)hBitmap對(duì)象進(jìn)行原DIB的輸入操作。除非你用它創(chuàng)建了一個(gè)兼容的hDC,并且沒(méi)有把這個(gè)hBitmap選入任何hDC對(duì)象。
3、隨機(jī)輸出:DirectX
這個(gè)很高深。為什么這么說(shuō)?因?yàn)槟阋謩?dòng)進(jìn)行好多轉(zhuǎn)換,然后以占用至少30MB內(nèi)存為代價(jià),來(lái)實(shí)現(xiàn)動(dòng)態(tài)圖像的極連貫的輸出。在這里我不做詳細(xì)介紹了,本人水平有限,正在研究這個(gè)東東。同樣的,希望來(lái)個(gè)誰(shuí)幫幫偶~
Over.
不知道這篇小心得對(duì)大家有沒(méi)有用,有用的話說(shuō)一聲,謝了~呵呵~