2013-01-04 14 views
7

में एक बिटमैप छवि ऑब्जेक्ट में एक लिखने योग्य बिटमैप ऑब्जेक्ट को कैसे परिवर्तित करूं? मैं WriteableBitmap ऑब्जेक्ट को BitmapImage ऑब्जेक्ट को WPF में कैसे परिवर्तित करूं?मैं WPF

This link चांदी की रोशनी को कवर करता है, यह प्रक्रिया WP12 में समान नहीं है क्योंकि WriteableBitmap ऑब्जेक्ट में SaveJpeg विधि नहीं है।

तो मेरा सवाल यह है कि मैं WriteableBitmap ऑब्जेक्ट को BitmapImage ऑब्जेक्ट को WPF में कैसे परिवर्तित करूं?

+1

सी [इस उत्तर] (http: //stackoverflow.com/a/13988871/1136211) और Wri द्वारा RenderTargetBitmap को प्रतिस्थापित करें teableBitmap। आपको वास्तव में इस रूपांतरण की आवश्यकता क्यों है? आमतौर पर यह आवश्यक नहीं है, क्योंकि बिटमैप इमेज और लिखितबल बिटमैप में एक सामान्य बेस क्लास बिटमैपसोर्स है जो किसी छवि के सभी प्रासंगिक गुण प्रदान करता है। – Clemens

उत्तर

11

आप इस उदाहरण में एक नया BitmapImage

को WriteableBitmap फ्रेम को बचाने के लिए हम PngBitmapEncoder का उपयोग करेगा लेकिन सिर्फ एक है कि आपकी स्थिति के अनुसार चुनें BitmapEncoders से एक का उपयोग कर सकते हैं।

public BitmapImage ConvertWriteableBitmapToBitmapImage(WriteableBitmap wbm) 
{ 
    BitmapImage bmImage = new BitmapImage(); 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     PngBitmapEncoder encoder = new PngBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(wbm)); 
     encoder.Save(stream); 
     bmImage.BeginInit(); 
     bmImage.CacheOption = BitmapCacheOption.OnLoad; 
     bmImage.StreamSource = stream; 
     bmImage.EndInit(); 
     bmImage.Freeze(); 
    } 
    return bmImage; 
} 

उपयोग:

BitmapImage bitmap = ConvertWriteableBitmapToBitmapImage(your writable bitmap); 

या आप इस आसान उपयोग के लिए एक विस्तार विधि बना सकता है

public static class ImageHelpers 
{ 
    public static BitmapImage ToBitmapImage(this WriteableBitmap wbm) 
    { 
     BitmapImage bmImage = new BitmapImage(); 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      PngBitmapEncoder encoder = new PngBitmapEncoder(); 
      encoder.Frames.Add(BitmapFrame.Create(wbm)); 
      encoder.Save(stream); 
      bmImage.BeginInit(); 
      bmImage.CacheOption = BitmapCacheOption.OnLoad; 
      bmImage.StreamSource = stream; 
      bmImage.EndInit(); 
      bmImage.Freeze(); 
     } 
     return bmImage; 
    } 
} 

उपयोग:

WriteableBitmap wbm = // your writeable bitmap 

BitmapImage bitmap = wbm.ToBitmapImage(); 
+1

और स्ट्रीम को रिवाइंड करना न भूलें। सहेजने के बाद, 'bmImage.StreamSource' सेट करने से पहले 'स्ट्रीम करें। Sek (0, SeekOrigin.Begin); '। कुछ डिकोडर्स (उदा। जेपीजी) को इसकी आवश्यकता होती है। यह भी देखें [यहां] (http://stackoverflow.com/a/13988871/1136211)। – Clemens

+0

धन्यवाद, दोनों सबसे उपयोगी! – JMK

+0

@JMK फिर भी मुझे संदेह है कि यह रूपांतरण करना वास्तव में आवश्यक है। – Clemens