將圖像轉換為JPG或GIF字節流。


      其實這個東西真的沒有什么可談的,完全都是一堆API函數的調用,不過呢,隔那么一段時間就有人在那里問,而且一般也得不到正確的答案,因此,我還是畫蛇添足,共享一下這些調用的苦力活吧。

      從我個人的理解來看,有這種需求的人無非可能想做兩件事,第一種是想搞類似屏幕傳輸或遠程控制方面的東西,這個至少占了90%以上,而可以明確的告訴這部分朋友,JPG流實現遠程控制是條死路。第二種是想實現保存JPG圖像是壓縮質量的預覽,這個我在示例代碼中做了一個簡單的工程,大家可以參考。

      很多朋友都會用GDI+的GdipSaveImageToFile函數將圖像保存為JPG文件,要獲得對應的JPG字節流,一些折中的辦法就是保存為文件后再通過二進制讀取他,這實在是個彎路,在GDI+中還有一個函數GdipSaveImageToStream可將圖像數據直接壓縮為你指定格式的流對象。

      使用VB6或者VC6的朋友常常在程序中使用的是一些GDI的對象,比如Hbitmap或者Stdpicture,為了能調用GDI+的相關函數,必須先將他們轉換為GDI+可識別的對象,這些轉換函數有很多,例如GdipCreateBitmapFromScan0、GdipCreateBitmapFromHBITMAP、GdipCreateBitmapFromGdiDib、GdipCreateBitmapFromResource、GdipCreateBitmapFromHICON等等。

      同GdipLoadImageFromFile一樣,對應也有GdipLoadImageFromStream函數,將流對象轉換為Bitmap。

      列舉轉換為JPG字節流的部分代碼如下:

 1  Public  Function GetJpgArrayForm24Dib(Img  As StdPicture,  Optional Quality  As  Long =  80As  Byte()
 2      Dim Image                    As  Long
 3      Dim IIStream                 As IUnknown
 4      Dim uEncCLSID( 3)             As  Long
 5      Dim aEncParams()             As  Byte
 6      Dim uEncParams               As EncoderParameters
 7      Dim Data()               As  Byte
 8      Dim Memory                   As  Long
 9      Dim OldMemory                As  Long
10      Dim MemorySize               As  Long
11     GdipCreateBitmapFromHBITMAP Img.Handle,  0, Image
12     GetEncoderClsID  " Image/jpeg ", uEncCLSID
13     uEncParams.Count =  1
14      ReDim aEncParams( 1  To  Len(uEncParams))
15      With uEncParams.Parameter
16         .NumberOfValues =  1
17         .Type = [EncoderParameterValueTypeLong]
18          Call CLSIDFromString(StrPtr(EncoderQuality), .GUID( 0))
19          If Quality <  0  Then
20             Quality =  0
21          ElseIf Quality >  100  Then
22             Quality =  100
23          End  If
24         .Value = VarPtr(Quality)
25      End  With
26      Call CopyMemory(aEncParams( 1), uEncParams,  Len(uEncParams))
27     
28     CreateStreamOnHGlobal  01, IIStream
29     GdipSaveImageToStream Image, IIStream, uEncCLSID( 0&), aEncParams( 1)
30     GetHGlobalFromStream  ByVal ObjPtr(IIStream), Memory
31     MemorySize = GlobalSize(Memory)
32     OldMemory = GlobalLock(Memory)
33      ReDim Data( 0  To MemorySize -  1)
34     CopyMemory Data( 0),  ByVal OldMemory, MemorySize
35     GlobalUnlock Memory
36     GdipDisposeImage Image
37     GetJpgArrayForm24Dib = Data
38  End Function

 

示例工程下載地址:http://files.cnblogs.com/Imageshop/BmpToJpgStream.rar

界面預覽:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM