程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> .NET中操作IPicture、IPictureDisp的小隨筆

.NET中操作IPicture、IPictureDisp的小隨筆

編輯:C#入門知識

【題外話】

最近在做一個調用某實驗儀器的程序,這個儀器提供了Windows上COM的接口。調用儀器的時候需要傳輸圖片,提供的接口裡使用了IPicture這個接口,由於以前沒接觸過,所以查找了一些資料,整理了一下與.NET中System.Drawing.Image的互轉的方式。

 

【文章索引】

 

【一、IPicture和IPictureDisp是什麼】

根據MSDN上對IPicture和IPictureDisp的說明來看,IPicture與IPictureDisp提供了與語言無關的接口,這個接口用來提供對位圖(Bitmap)、圖標(Icon)、圖元文件(Metafile)的抽象,其中後者還實現了IDispatch接口以實現COM的自動化接口。總之,如果通過COM接口傳輸圖像的話,可能會接觸到這兩個接口。

 

【二、使用AxHost實現與System.Drawing.Image的互轉】

.NET在System.Windows.Forms下提供了一個叫AxHost的類來實現與ActiveX控件進行訪問,不過這裡用到的只是在AxHost裡的protected的靜態方法而已。由於是protected的方法,所以沒有辦法直接調用,好在AxHost不是密封的類,所以我們還可以通過集成AxHost來實現調用,例如以下的代碼:

   
          IPictureConverter() : ( 
      IPictureDisp
                  
                      
 
      IPicture
                  
                      
 }

【三、使用VB6 compatibility library實現互轉】

除了AxHost,其實微軟也提供了另外一個庫提供托管的Image與IPicture等互轉,那就是Microsoft.VisualBasic.Compatibility.dll,其中有一個叫Support的類提供了很多向後兼容的方法。對於IPicture或IPictureDisp的轉換,我們可以寫如下代碼:

   
          IPictureDisp
                  
                      
 
      IPicture
                  
                      
 }

看起來兩者幾乎是一樣的,不過有意思的是,雖然兩者的很多方法如GetPICTDESCFromPicture等都不是同一個方法,甚至IPicture等接口都不是在一個庫裡定義的(AxHost是在System.Windows.Forms.UnsafeNativeMethods中定義的,而VB6 compatibility library則是在單獨的一個stdole.dll中定義的),但是其調用的方法裡執行的內容基本都相同,IPicture等接口也都是ComImport的同一個Guid,而兩個方法實現的源頭,更都是DllImport的oleaut32.dll,調用其中的“OleCreatePictureIndirect”方法,所以上述兩種方法是完全一樣的。

不過在4.0的CLR下,提供的Microsoft.VisualBasic.Compatibility.dll的版本為10.0.0.0,Support類以及相應的方法都被標記為過時的(Obsolete),所以編譯的時候提示的警告也蠻讓人惡心的(2.0的CLR下提供的8.0.0.0的dll沒有這個問題),所以倒不妨采用第一種方法。

 

【四、Alpha通道的問題】

如果你的圖片包含Alpha通道的話,上述轉換可能會導致顏色有些問題,由於IPicture沒有辦法支持Alpha通道,所以妥協的辦法只能是要麼不用Alpha通道,要麼在轉換為IPicture前在圖片底下墊上一個純色的背景(比如對方程序中要顯示圖片的位置的背景),比如How to Convert a System.Drawing.Image to an IPictureDisp with Alpha Transparency這篇文章就是這麼做的。

 

【相關鏈接】

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved