我正在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;
}
当图像打开时,就像这样。
将其更改为字节数组并将字节数组更改为图像源后再次应用。它改变了图像颜色,虽然我没有改变任何字节数组的值。
问题出在哪里?是否转换为字节数组错误或将字节数组转换为位图?
答案 0 :(得分:1)
<强>解决方案:强>
好吧,我找到了这个问题的解决方案,就是我在PixelDataProvider中使用BitmapPixelFormat.Rgba8(同时获取像素数据)。相反,我应该使用BitmapPixelFormat。 Bgra8 。