相對而言,不是很難,我們並不需要解碼器來得到JPG的每一個字節,或任何類似於次的,相反,我們將用一個圖片框來打開一個圖片,然後再將其傳到表面,但首先我門需要聲明API函數:
Public Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Public Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Public Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Public Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
現在我們要為加載圖片作好准備
Dim Pict1 As StdPicture
Set Pict1 = LoadPicture("MyPict.jpg")
創造表面:
Dim TDesc As DDSurfaceDesc2
TDesc.lFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH
TDesc.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
TDesc.lHeight = CLng((Pict1.Height * 0.001) * 567 / Screen.TwipsPerPixelY)
TDesc.lWidth = CLng((TPict.Width * 0.001) * 567 / Screen.TwipsPerPixelX)
Set Surf = DDraw.CreateSurface(TDesc)
Dim SurfDC As Long, PictDC As Long
SurfDC = Surf.GetDC
PictDC = CreateCompatibleDC(0)
SelectObject Pict1.Handle, PictDC
我們將使用Dcs和Bitblt或StretchBlt來把Pic1復制到表面
只復制成一樣大小:
BitBlt SurfDC, 0, 0, TDesc.lWidth, TDesc.lHeight, PictDC, 0, 0, vbSrcCopy
現在復制並且改變圖片大小
StretchBlt SurfDC, 0, 0, StretchWidth, StretchHeight, PictDC, 0, 0, TDesc.lWidth, TDesc.lWidth, vbSrcCopy
釋放DC:
Surf.ReleaseDC SurfDC
DelecteDC PictDC
Set Pict1 = Nothing
下一步該怎麼作呢?下載SurfUtil。Bas,我將利用這一技巧來創造並加載圖片
注意:有時StretchBlt不能正常顯示GIF,那就是我添加了BitBlt這個函數的原因
.
特殊效果
你會懶的不想利用C/C++或匯編來創造一個動態連接庫,並用那個動態連接庫來完成特殊效果嗎?
就讓blitter(我不認識,也查不出來,可能是glitter,閃光)光柵操作(ROP)為你工作!
我的格言是讓最小的努力為你帶來最大的報酬!
在Vb中有不少可使用的ROP常數:
vbSrcPaint -邏輯或操作,源和目標圖片,做一個模擬的Alpha混合效果。
vbSrcAnd - 邏輯與操作,灰度效果。
vbSrcInvert - 邏輯異或操作。
vbSrcErase - 翻轉目標圖片,然後再和源圖片進行邏輯與操作
vbSrcCopy - 把原圖片直接復制到目標圖片上,在圓滿的替換掉?(replacing it completely)
vbDstInvert -翻轉目標圖片,全部忽略原圖片。
vbNotSrcCopy -翻轉源圖片,然後在直接復制到目標上,又是圓滿的替換掉?(replacing it completely)
vbNotSrcErase - 對源圖片和目標圖片進行邏輯或操作,在翻轉。
現在我們利用這些ROP有兩個執行銷毀的方法。我們能夠使用APIBitBlt這個函數,,也可以使用DirectX的BltFx函數,只有用戶的顯卡能夠使用硬件來支持ROP而不是軟件模擬ROP,BltFx才能夠工作,否則BltFx將會失敗!無論怎樣,BltFx失敗時,API的BitBlt還是能夠調用,在軟件中,一切就緒時,BitBlt就決不會失敗!
(深思熟慮:當使用BltFx時,它可以完美的將表面放到顯存以使其借助顯卡的Blitter(和上面的一樣,不認識也查不出來)來快速訪問,而當另外使用API函數BitBlt時,它卻完美的將其置放到系統內存,否則數據將會被從顯存中修改後帶來,然後它將回到顯存,沒有效率啊!)
容易的知道確認用戶的顯卡是否硬件支持特殊的ROP是件很好的事,我寫了一個簡單的函數來確認:
Private Function TestROP(ByRef surfBack As DirectDrawSurface7, lngROP As Long) As Boolean
Dim objBltFx As DDBLTFX
Dim rectTemp As RECT