BitmapImage 到字节数组,反之亦然

BitmapImage to byte array and vice versa

我正在 uwp 中开发图像处理应用程序 windows 10. 我正在使用文件选择器打开图像,如下所示。

FileOpenPicker openPicker = new FileOpenPicker();           
           openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
           openPicker.ViewMode = PickerViewMode.Thumbnail;
           openPicker.FileTypeFilter.Clear();
           openPicker.FileTypeFilter.Add(".bmp");
           openPicker.FileTypeFilter.Add(".png");
           openPicker.FileTypeFilter.Add(".jpeg");
           openPicker.FileTypeFilter.Add(".jpg");
           StorageFile file = await openPicker.PickSingleFileAsync();
            if(file!=null)
            {
                IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.Read);
                BitmapImage bitmapImage = new BitmapImage();
                bitmapImage.SetSource(fileStream);
                myImage.Source = bitmapImage;
               
                // code to retrieve bytes of bitmap image
            }

在上面的 if 语句中,我正在从此图像中检索字节,如下所示。

//Fetching pixel data
            using (IRandomAccessStream fileStreams = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
            {
                BitmapDecoder decoder = await BitmapDecoder.CreateAsync(fileStreams);
                BitmapTransform transform = new BitmapTransform()
                {
                    ScaledWidth = Convert.ToUInt32(bitmapImage.PixelWidth),
                    ScaledHeight = Convert.ToUInt32(bitmapImage.PixelHeight)
                };
                PixelDataProvider pixelData = await decoder.GetPixelDataAsync(
                    BitmapPixelFormat.Rgba8,
                    BitmapAlphaMode.Straight,
                    transform,
                    ExifOrientationMode.IgnoreExifOrientation,// This sample ignores Exif orientation
                    ColorManagementMode.DoNotColorManage
               );

                // byte[] , a global variable
                sourcePixels = pixelData.DetachPixelData();
                // uint , a global variable
                width = decoder.PixelWidth;
                // uint , a global variable
                height = decoder.PixelHeight;
            }
               

现在我需要操纵这个字节数组来产生不同的效果。但出于测试目的,我再次将此字节数组转换为位图图像并将其值设置为主图像源(在按钮单击事件中)。但它无法正常工作,因为

 WriteableBitmap scaledImage = new WriteableBitmap((int)width, (int)height);
            using (Stream stream = scaledImage.PixelBuffer.AsStream())
            {
                await stream.WriteAsync(sourcePixels, 0, sourcePixels.Length);
                myImage.Source = scaledImage;
            }

图片打开时是这样的

在将其更改为字节数组并将字节数组更改为图像源后再次应用时。它改变了图像颜色,尽管我没有改变字节数组的任何值。

问题出在哪里??是字节数组转换错误还是字节数组转位图错误?

解法:

好吧,我找到了这个问题的解决方案,我在 PixelDataProvider 中使用了 BitmapPixelFormat.Rgba8(同时获取像素数据)。相反,我应该使用 BitmapPixelFormat.Bgra8.