Я разрабатываю приложение для обработки изображений в окнах uwp 10. Я открываю изображение, используя файл picker, как показано ниже.BitmapImage to byte array и наоборот
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
}
Внутри инструкции выше, я извлекаю байты из этого изображения, как показано ниже.
//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;
}
Когда изображение было открыто, все было так.
при нанесении снова после его изменения в массив байтов и массив байтов для источника изображения. Он меняет цвета изображения, хотя я не изменял никаких значений байтового массива.
Где проблема ?? Является ли преобразование в байтовый массив неправильным или преобразование байтового массива в растровое изображение?
Похоже, b/g/r заменены, вместо этого попробуйте BitmapPixelFormat.Bgra8. –