दिलचस्प पोस्ट
गर्तिका के संचालन के लिए एक समय समाप्ति सेट करना डाटासैट को बदलते बिना डेटाग्रिड दृश्य फ़िल्टर करना जावास्क्रिप्ट – सभी वैश्विक चर डंपिंग एकाधिक तालिकाओं से एसक्यूएल क्वेरी रिटर्न डेटा कैसे हो सकता है प्रयोगकर्ता के रूप में आईडी कैसे लेते हैं, जब हैश का उपयोग किया जाता है? MySQL – IN के भीतर मूल्यों के आधार पर ORDER जाओ: एक-मान संदर्भ में एकाधिक मान 4 छवि-पथ, छवि-यूआरएल और संपत्ति-यूआरएल अब एससीएसएस फाइलों में काम नहीं करता है हाइबरनेट में बायपास जनरेटेड वैल्यू (डेटा को डीबी में नहीं मिलाएं?) एंड्रॉइड में वापस बटन अक्षम करें एंड्रॉइड मार्केट से ऐप इंस्टॉल करने के बाद रेफरर प्राप्त करें सी # यादृच्छिक संख्या जेनरेटर थ्रेड सुरक्षित है? अजगर का "सुपर" सही काम कैसे करता है? एक assoc सरणी को लाते समय घातक त्रुटि को कैसे निकालें कुछ आदानों पर IE10 का "साफ़ फ़ील्ड" एक्स बटन निकालें?

बिटमैप को बिटमैप सोर्स 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% है

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

वेब के समाधान से एकत्रित समाधान "बिटमैप को बिटमैप सोर्स 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% है