2010-07-13 137 views
2

如何將WPF WriteableBitmap對象轉換爲System.Drawing.Image?WPF/WinForms/GDI互操作:將WriteableBitmap轉換爲System.Drawing.Image?

我的WPF客戶端應用程序將位圖數據發送到Web服務,並且Web服務需要爲此構建一個System.Drawing.Image。

我知道我能得到一個WriteableBitmap的數據,在發送信息到網絡服務:

// WPF side: 

WriteableBitmap bitmap = ...; 
int width = bitmap.PixelWidth; 
int height = bitmap.PixelHeight; 
int[] pixels = bitmap.Pixels; 

myWebService.CreateBitmap(width, height, pixels); 

但在網絡服務端,我不知道如何創建一個System.Drawing中。從這些數據中獲得圖像。

// Web service side: 

public void CreateBitmap(int[] wpfBitmapPixels, int width, int height) 
{ 
    System.Drawing.Bitmap bitmap = ? // How can I create this? 
} 

回答

3

此博客post顯示瞭如何將您的WriteableBitmap編碼爲jpeg圖像。也許這有幫助?

如果你真的要傳輸的原始圖像數據(像素),你可以:

  1. 創建一個System.Drawing.Bitmap具有正確大小
  2. 迭代在你的原始數據,將原始數據轉換成一個系統。 Drawing.Color(例如,通過Color.FromArgb()並通過SetPixel()

設置新創建的圖像中每個像素的顏色我肯定會喜歡的第一個解決方案(在博客文章中所述)。

+0

謝謝。我會玩,看看這是否有幫助。 – 2010-07-14 01:20:59

+0

好的,這工作。謝謝您的幫助。 – 2010-07-14 16:19:42

3

如果你的位圖數據是未壓縮的,你可以使用這個System.Drawing.Bitmap構造函數:Bitmap(Int32, Int32, Int32, PixelFormat, IntPtr)

如果位圖編碼爲jpg或png,請從位圖數據創建MemoryStream,並將其與Bitmap(Stream)構造函數配合使用。

編輯:

既然你要發送的位圖到Web服務,我建議你進行編碼開始。 System.Windows.Media.Imaging命名空間中有幾個編碼器。例如:

WriteableBitmap bitmap = ...; 
    var stream = new MemoryStream();    
    var encoder = new JpegBitmapEncoder(); 
    encoder.Frames.Add(BitmapFrame.Create(bitmap)); 
    encoder.Save(stream); 
    byte[] buffer = stream.GetBuffer(); 
    // Send the buffer to the web service 

在接收端,簡單地說:

var bitmap = new System.Drawing.Bitmap(new MemoryStream(buffer)); 

希望有所幫助。

+0

我的數據是簡單的wpfWriteableBitmap.Pixels,它返回一個int [] – 2010-07-14 13:46:09

+0

我已經更新了我的答案,舉例說明了如何在發送位圖之前編碼位圖,以及如何在Web服務中對其進行解碼。 – 2010-07-15 07:35:17

0

現在的問題是針對WPF,Pixels似乎不是WriteableBitmap的財產。這裏的一些答案指向了SilverLight文章,所以我懷疑這可能是WPF和SilverLight之間的區別。

相關問題