C# Windows 8 Store (Metro, WinRT) Byte array to BitmapImage

后端 未结 2 2105
粉色の甜心
粉色の甜心 2020-12-16 14:04

I am working on a Windows 8 Metro app that applies filters to images. I have a web version of the app and wanted to port it. But as we all know WinRT doesn\'t have all the g

相关标签:
2条回答
  • 2020-12-16 14:46

    this is my first answer..hope it will help.

    I had the exact same problem and I spand more then 6 hours trying to figur this out. this is what i came up with: what you said was right. there are 2 waye to convert image to byteArray:

    First aproach(yours)

            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();
        }
    

    Second 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;
        }
    

    if youll use the second aproach to decode the pic, with no Pixel, this converter will work:

    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();
        }
    

    for the first aproach youll need to work with WriteableBitmap as you said.

    0 讨论(0)
  • 2020-12-16 15:03

    This is working for me,

        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 讨论(0)
提交回复
热议问题