2013-08-05 237 views
0

我正在開發一個控件,用戶可以在其中設置圖像,我希望這可以儘可能地方便用戶 - 所以支持複製&粘貼,拖動&拖放。Image/ImageSource/Interop Image to bytearray

我有這部分使用IDataObjects工作,測試的FileDrop的fileformats,FileContents(例如從Outlook),和位圖例如:

private void GetImageFromIDataObject(IDataObject myIDO) 
    { 
     string[] dataformats = myIDO.GetFormats(); 

     Boolean GotImage = false; 

     foreach (string df in dataformats) 
     { 
      if (df == DataFormats.FileDrop) 
      { 
       // code here 
      } 
      if (df == DataFormats.Bitmap) 
      { 
       // Source of my problem here... this gets & displays image but 
       // how do I then convert from here ? 
       ImageSource myIS = Utilities.MyImaging.ImageFromClipboardDib(); 
       ImgPerson.Source = myIS; 
      } 
     } 
    } 

的ImageFromClipboard代碼是托馬斯·萊維斯克在回答作爲參考這太問題wpf InteropBitmap to bitmap

http://www.thomaslevesque.com/2009/02/05/wpf-paste-an-image-from-the-clipboard/

無論我如何獲取圖像到ImgPerson,這部分工作正常;圖像很好地顯示。

當用戶按下保存時我需要將圖像轉換爲bytearray併發送到WCF服務器,該服務器將保存到服務器 - 如在重建字節數組到圖像並將其保存在文件夾中。

對於所有格式的拖動&拖放,複製&粘貼圖像是某種形式的System.Windows.Media.Imaging.BitmapImage。

除了那些涉及使用托馬斯代碼的剪貼板變成System.Windows.Media.Imaging.BitmapFrameDecode。

如果我避免托馬斯的代碼和使用:

BitmapSource myBS = Clipboard.GetImage(); 
ImgPerson.Source = myBS; 

我得到一個System.Windows.Interop.InteropBitmap。

我不知道如何使用這些;讓他們進入一個bytearray,所以我可以傳遞給WCF重建和保存到文件夾。

回答

0

我不能相信我沒有看到這太問題,但這個基本上是一樣的,我的問題:

WPF: System.Windows.Interop.InteropBitmap to System.Drawing.Bitmap

答案之中:

BitmapSource bmpSource = msg.ThumbnailSource as BitmapSource; 
MemoryStream ms = new MemoryStream(); 
BitmapEncoder encoder = new PngBitmapEncoder(); 
encoder.Frames.Add(BitmapFrame.Create(bmpSource)); 
encoder.Save(ms); 
ms.Seek(0, SeekOrigin.Begin); 


System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(ms); 

與Nitesh的答案類似,但關鍵性的是,它與一個內部操作位圖一起工作。

0

嘗試這段代碼

public byte[] ImageToBytes(BitmapImage imgSource) 
    { 
     MemoryStream objMS = new MemoryStream();   
     PngBitmapEncoder encoder = new PngBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(imgSource)); 
     encoder.Save(objMS); 
     return objMS.GetBuffer(); 
    } 

您還可以使用JpegBitmapEncoderBmpBitmapEncoder根據您的要求。

byte[] arr = ImageToBytes(ImgPerson.Source as BitmapImage); 
+0

我以前試過BitmapImage myBI = ImgDriver.Source作爲BitmapImage,這導致null;所以演員沒有工作。我不能在明天之前測試你的答案,但是我懷疑這兩個選項仍然會導致隱式演員無效? – andrew