दिलचस्प पोस्ट
डीओएम परिवर्तनों का पता लगाने / निगरानी करने का सबसे प्रभावी तरीका? JSF कन्वर्टडेटटाइम पिछले दिन रेंडर करता है आर और वस्तु उन्मुख प्रोग्रामिंग स्प्रिंग: एक मानचित्र या गुण ऑब्जेक्ट के रूप में सभी पर्यावरण गुणों का उपयोग करें क्या सॉर्टेड सूची <कश्मीर, वी> पर एक निचला बाउंड फ़ंक्शन है? स्क्रीन बंद होने पर एंड्रॉइड एक्सेलेरोमीटर काम नहीं करता है एक WPF Treeview में SelectedItem के लिए बाइंडिंग डेटा फोन-गैप-जावास्क्रिप्ट क्रॉस-डोमेन अजाक्स अनुरोध भेज रहा है HTML कैनवास जावास्क्रिप्ट पुस्तकालयों और चौखटे में कला की वर्तमान स्थिति क्या है? कुछ डेटा को दूसरे टुकड़ों में कैसे स्थानांतरित किया जाए? एंड्रॉइड स्टूडियो का उपयोग करते हुए मैं साझा प्राथमिकता फाइल कैसे देख सकता हूं? एक व्यू मॉडेल के लिए कई डेटाटैम्पलेट के साथ आइटम्स कंट्रोल क्रोम डेवलपमेंट टूल: जावास्क्रिप्ट से फाइल मैं एंज्यूलर जेएस के साथ JSON फ़ीड से एक चयन ड्रॉपडाउन सूची को कैसे पॉप्यूलेट कर सकता हूं? एक सापेक्ष पथ के साथ JasperReports का उपयोग करना

बिटमैप को बिटमैप सोर्स WPF में तेजी से परिवर्तित करना

मुझे 30Hz पर Image घटक पर एक चित्र खींचने की आवश्यकता है मैं इस कोड का उपयोग करता हूं:

 public MainWindow() { InitializeComponent(); Messenger.Default.Register<Bitmap>(this, (bmp) => { ImageTarget.Dispatcher.BeginInvoke((Action)(() => { var hBitmap = bmp.GetHbitmap(); var drawable = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); DeleteObject(hBitmap); ImageTarget.Source = drawable; })); }); } 

समस्या यह है कि इस कोड के साथ, मेरा CPU उपयोग लगभग 80% है, और, रूपांतरण के बिना यह लगभग 6% है

तो क्यों बिटमैप परिवर्तित करना बहुत लंबा है?
क्या तेज़ तरीका है (असुरक्षित कोड के साथ)?

Solutions Collecting From Web of "बिटमैप को बिटमैप सोर्स WPF में तेजी से परिवर्तित करना"

यहां एक तरीका है जो (मेरा अनुभव) CreateBitmapSourceFromHBitmap से कम से कम चार गुना तेज है।

इसके लिए आपको परिणामस्वरूप बिटमैपसोर्स के सही PixelFormat सेट करना आवश्यक है।

 public BitmapSource Convert(System.Drawing.Bitmap bitmap) { var bitmapData = bitmap.LockBits( new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bitmap.PixelFormat); var bitmapSource = BitmapSource.Create( bitmapData.Width, bitmapData.Height, bitmap.HorizontalResolution, bitmap.VerticalResolution, PixelFormats.Bgr24, null, bitmapData.Scan0, bitmapData.Stride * bitmapData.Height, bitmapData.Stride); bitmap.UnlockBits(bitmapData); return bitmapSource; } 

क्लीमेन्स से जवाब देने से पहले मैंने उत्तर दिया:

  WriteableBitmap writeableBitmap = new WriteableBitmap(1280, 1024, 96.0, 96.0, PixelFormats.Bgr24, null); public MainWindow() { InitializeComponent(); ImageTarget.Source = writeableBitmap; Messenger.Default.Register<Bitmap>(this, (bmp) => { ImageTarget.Dispatcher.BeginInvoke((Action)(() => { BitmapData data = bmp.LockBits(new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat); writeableBitmap.Lock(); CopyMemory(writeableBitmap.BackBuffer, data.Scan0, (writeableBitmap.BackBufferStride * bmp.Height)); writeableBitmap.AddDirtyRect(new Int32Rect(0, 0, bmp.Width, bmp.Height)); writeableBitmap.Unlock(); bmp.UnlockBits(data); })); }); } 

अब मेरा CPU उपयोग लगभग 15% है