15

पर बाइट सरणी मैं विंडोज 8 मेट्रो ऐप पर काम कर रहा हूं जो छवियों पर फ़िल्टर लागू करता है। मेरे पास ऐप का एक वेब संस्करण है और इसे बंद करना चाहता था। लेकिन जैसा कि हम सभी जानते हैं कि WinRT में सभी अच्छी चीजें नहीं हैं .नेट अन्यथा प्रदान करता है:/सी # विंडोज 8 स्टोर (मेट्रो, विनआरटी) बाइटमैम

वर्तमान में मैं एक बाइट सरणी पर फ़िल्टर लागू कर रहा हूं और मैं इसे इस तरह से रखना चाहता हूं, क्योंकि यह बहुत तेज़ है! तो पिछले कुछ दिनों से मैं स्टोरेजफाइल को बाइट [] और फिर बाइट [] से बिटमैप इमेज में बदलने के तरीकों की तलाश कर रहा हूं।

अब तक मैंने पहला (स्टोरेजफाइल टू बाइट []) करने में कामयाब रहा है। यहाँ कैसे मैं यह कर रहा है:

public async Task<Byte[]> ImageFileToByteArray(StorageFile file) 
    { 
     IRandomAccessStream stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read); 
     BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream); 
     PixelDataProvider pixelData = await decoder.GetPixelDataAsync(); 
     return pixelData.DetachPixelData(); 
    } 

कोड का यह टुकड़ा देता है एक byte[] कि BGRA के रूप में पिक्सेल डेटा होता है।

और यहां मुश्किल हिस्सा आता है। मैं बाइट सरणी को BitmapImage में सफलतापूर्वक रूपांतरित नहीं कर सकता। मैंने सभी जगहों पर खोज की है और कई लोग लिखने योग्य बिटमैप का उपयोग करने का सुझाव देते हैं लेकिन यह मेरे लिए बहुत अच्छा नहीं करता है। मुझे कोड के कुछ टुकड़े भी मिल गए हैं जो काम कर रहे हैं ... लेकिन वे नहीं करते हैं।

समाधान मैं कोशिश की है इस तरह InMemoryRandomAccessStream उपयोग कर रहा है में से एक:

प्रकार का एक अपवाद 'System.Exception' mscorlib में हुई:

public async Task<BitmapImage> ByteArrayToBitmapImage(Byte[] pixels) 
    { 
     var stream = new InMemoryRandomAccessStream(); 
     await stream.WriteAsync(pixels.AsBuffer()); 
     stream.Seek(0); 
     var image = new BitmapImage(); 
     await image.SetSourceAsync(stream); 
     return image; 
    } 

यह एक निम्न अपवाद फेंकता है। डीएलएल लेकिन उपयोगकर्ता कोड

अतिरिक्त जानकारी: घटक नहीं मिला। (HRESULT से अपवाद: 0x88982F50)

मैं बजाय इस लाइन उपयोग करने की कोशिश:

PixelDataProvider pixelData = await decoder.GetPixelDataAsync(
      BitmapPixelFormat.Bgra8, 
      BitmapAlphaMode.Ignore, 
      new BitmapTransform(), 
      ExifOrientationMode.IgnoreExifOrientation, 
      ColorManagementMode.DoNotColorManage); 

लेकिन यह मुझे अच्छा नहीं किया था के बाद से मुझे लगता है कि अपवाद मिलती रहती है।

मैं भी इस की कोशिश की है:

var bitmapImage = new BitmapImage(); 
     var pixels = await ImageFileToByteArray(file); 
     ImageSource imgSource; 
     using (InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream()) 
     { 
      using (DataWriter writer = new DataWriter(ms.GetOutputStreamAt(0))) 
      { 
       writer.WriteBytes(pixels); 
       await writer.StoreAsync(); 
      } 

      await bitmapImage.SetSourceAsync(ms); 
      imgSource = bitmapImage; 
     } 

और कोड के पहले टुकड़े के रूप में एक ही अपवाद मिलता है।

मैंने कई अन्य तरीकों का भी प्रयास किया है जिसमें सामान्य स्ट्रीम का उपयोग करना शामिल है और फिर IRandomAccessStream में परिवर्तित हो रहा है लेकिन वे या तो काम नहीं करते हैं।

उपरोक्त सभी कोड मुझे ठीक लगता है। तो इस समय मेरा अनुमान यह है कि समस्या byte[] में है। मैं अनुमान लगा रहा हूं कि अंदर पिक्सेलडाटा का प्रारूप मान्य नहीं है, इसलिए मैंने इसे आरजीबीए में बदलने की कोशिश की लेकिन इससे कोई मदद नहीं मिली। इसके अलावा PixelHeight और BitmapImage की PixelWidth 0.

+0

क्या आपको इसका समाधान मिला है? मुझे भी यही समस्या है। – TheQuestioner

उत्तर

12

यह मेरे लिए काम कर रहा है, कर रहे हैं

private async Task<BitmapImage> ByteArrayToBitmapImage(byte[] byteArray) 
    { 
     var bitmapImage = new BitmapImage(); 

     var stream = new InMemoryRandomAccessStream(); 
     await stream.WriteAsync(byteArray.AsBuffer()); 
     stream.Seek(0); 

     bitmapImage.SetSource(stream); 
     return bitmapImage; 
    } 
+0

को काम करने के लिए शून्य (stream.Seek (0)) खोजना पड़ा :) बहुत बहुत धन्यवाद :) –

1

यह मेरा पहला answer..hope यह मदद मिलेगी है।

मुझे एक ही समस्या थी और मैं इसे और अधिक समझने की कोशिश कर 6 घंटों तक फैल गया। यही वह है जिसके साथ मैं आया: जो आपने कहा वह सही था।2 Waye bytearray करने के लिए छवि परिवर्तित करने के लिए देखते हैं:

पहले aproach (तुम्हारा)

 public async Task<byte[]> ImageFileToByteArrayAsync(StorageFile file) 
    { 
     IRandomAccessStream stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read); 
     BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream); 
     PixelDataProvider pixelData = await decoder.GetPixelDataAsync(); 
     return pixelData.DetachPixelData(); 
    } 

दूसरा aproach

 public async Task<byte[]> ImageFileToByteArrayAsync(StorageFile file) 
    { 
     var inputStream = await file.OpenSequentialReadAsync(); 
     var readStream = inputStream.AsStreamForRead(); 
     var buffer = new byte[readStream.Length]; 
     await readStream.ReadAsync(buffer, 0, buffer.Length); 
     return buffer; 
    } 

अगर आप दूसरी aproach का उपयोग पिक डिकोड करने के लिए कोई पिक्सेल के साथ,, इस कनवर्टर काम करेंगे:

public class ByteArrayToImageConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     if (value == null || !(value is byte[])) 
      return null; 

     using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream()) 
     { 
      using (DataWriter writer = new DataWriter(stream.GetOutputStreamAt(0))) 
      { 
       writer.WriteBytes((byte[])value); 
       writer.StoreAsync().GetResults(); 
      } 
      BitmapImage image = new BitmapImage(); 
      image.SetSource(stream); 
      return image; 
     } 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, string language)                   
    { 
     throw new NotImplementedException(); 
    } 

पहले aproach के लिए आप Writeabl के साथ काम करने की जरूरत है जैसा आपने कहा था eBitmap।

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