BitmapImage到字节数组,反之亦然

时间:2016-01-17 20:07:45

标签: c# bitmap windows-10 uwp bitmapimage

我正在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;
            }

现在我需要操作这个字节数组来生成不同的效果。但是出于测试目的,我将这个字节数组再次转换为bitmapimage并将其值设置为主图像源(在按钮单击事件中)。

但它无法正常工作
 WriteableBitmap scaledImage = new WriteableBitmap((int)width, (int)height);
            using (Stream stream = scaledImage.PixelBuffer.AsStream())
            {
                await stream.WriteAsync(sourcePixels, 0, sourcePixels.Length);
                myImage.Source = scaledImage;
            }

当图像打开时,就像这样。

enter image description here

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

enter image description here

问题出在哪里?是否转换为字节数组错误或将字节数组转换为位图?

1 个答案:

答案 0 :(得分:1)

<强>解决方案:

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