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.
我正在 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.