2009-07-13 7 views
72

मैं WP12 में Image नियंत्रण में Bitmap ऑब्जेक्ट को इन-मेमोरी कैसे आवंटित करूं?सिस्टम प्रदर्शित करने के लिए डब्ल्यूपीएफ में छवि नियंत्रण का उपयोग करना। ड्रॉइंग.बिटमैप

+0

की सटीक अनुलिपि http://stackoverflow.com/questions/94456/load-a-wpf-bitmapimage-from-a-system-drawing-bitmap-लेकिन मेरा उत्तर HBitmap –

उत्तर

16

आप छवि की स्रोत संपत्ति का उपयोग कर सकते हैं। इस कोड को आज़माएं ...

ImageSource imageSource = new BitmapImage(new Uri("C:\\FileName.gif")); 

image1.Source = imageSource; 
+38

उसके पास पहले से ही स्मृति में बिटमैप है, इसलिए वह uri –

+0

का उपयोग नहीं कर सकता है मेरे पास बिटमैप ऑब्जेक्ट है, वास्तव में यह एक स्कैन डिवाइस से उत्पन्न होता है, इसलिए मैं किसी भी स्थान को संदर्भित नहीं कर सकता –

+0

मेरे पास एक विधि है जो बिटमैप छवि देता है .. इसे स्रोत –

83
http://khason.net/blog/how-to-use-systemdrawingbitmap-hbitmap-in-wpf/

[DllImport("gdi32")] 
    static extern int DeleteObject(IntPtr o); 

    public static BitmapSource loadBitmap(System.Drawing.Bitmap source) 
    { 
     IntPtr ip = source.GetHbitmap(); 
     BitmapSource bs = null; 
     try 
     { 
      bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(ip, 
       IntPtr.Zero, Int32Rect.Empty, 
       System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); 
     } 
     finally 
     { 
      DeleteObject(ip); 
     } 

     return bs; 
    } 

यह (WindowsBased से) System.Drawing.Bitmap हो जाता है और BitmapSource में परिवर्तित कर, जो वास्तव में WPF में अपनी छवि नियंत्रण के लिए चित्र स्रोत के रूप में इस्तेमाल किया जा सकता के अनुसार

image1.Source = YourUtilClass.loadBitmap(SomeBitmap); 
+7

Thx लार्स को रिसाव नहीं करता है, लेकिन मैंने बहुत आसान किया, बिटमैप छवि bmpi = new बिटमैप छवि(); bmpi.BeginInit(); bmpi.StreamSource = नया मेमोरीस्ट्रीम (बाइटएरे); bmpi.EndInit(); image1.Source = bmpi; –

+3

ग्रेट। आप अपने सोल्यूशन को अपने प्रश्न के उत्तर के रूप में जोड़ सकते हैं। –

+0

मुझे बिटमैप इमेज नहीं दिख रहा है। स्ट्रीमसोर्स विधि। प्रशांत, क्या आपने कुछ गलत टाइप किया? –

16

डिस्क फ़ाइल के लिए यह आसान है, लेकिन स्मृति में बिटमैप के लिए कठिन है।

System.Drawing.Bitmap bmp; 
Image image; 
... 
MemoryStream ms = new MemoryStream(); 
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
ms.Position = 0; 
BitmapImage bi = new BitmapImage(); 
bi.BeginInit(); 
bi.StreamSource = ms; 
bi.EndInit(); 

image.Source = bi; 

Stealed here

+0

Thx के रूप में सेट करने के लिए कैसे करें, लेकिन कोड ने ms. को बंद नहीं किया है। मुझे लगता है कि आप http://stackoverflow.com/a/1069509/6116637 – lindexi

+0

@lindexi का उपयोग करेंगे, भले ही 'मेमोरीस्ट्रीम' 'IDisposable 'लागू करता है, यह स्पष्ट रूप से निपटान की आवश्यकता नहीं है क्योंकि यह किसी भी अप्रबंधित संसाधन को लपेटता नहीं है। यह एक बाइट सरणी की तरह है और अंत में जीसी द्वारा एकत्रित किया जाएगा। – kennyzx

2

मैं wpf के साथ एक कार्यक्रम में लिखा था और छवियां दिखाने के लिए डाटाबेस का इस्तेमाल किया और यह मेरा कोड है:

SqlConnection con = new SqlConnection(@"Data Source=HITMAN-PC\MYSQL; 
             Initial Catalog=Payam; 
             Integrated Security=True"); 

SqlDataAdapter da = new SqlDataAdapter("select * from news", con); 

DataTable dt = new DataTable(); 
da.Fill(dt); 

string adress = dt.Rows[i]["ImgLink"].ToString(); 
ImageSource imgsr = new BitmapImage(new Uri(adress)); 
PnlImg.Source = imgsr; 
+2

अच्छा जवाब, लेकिन मैं अत्यधिक कथन का उपयोग करने में एसक्यूएल ऑब्जेक्ट्स को लपेटने की अनुशंसा करता हूं ताकि जब आप उनका उपयोग कर लें तो उनका निपटान किया जाएगा। –

संबंधित मुद्दे