पर बाइट सरणी मैं विंडोज 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.
क्या आपको इसका समाधान मिला है? मुझे भी यही समस्या है। – TheQuestioner