2016-01-17 7 views
3

Я разрабатываю приложение для обработки изображений в окнах 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; 
      } 

Когда изображение было открыто, все было так.

enter image description here

при нанесении снова после его изменения в массив байтов и массив байтов для источника изображения. Он меняет цвета изображения, хотя я не изменял никаких значений байтового массива.

enter image description here

Где проблема ?? Является ли преобразование в байтовый массив неправильным или преобразование байтового массива в растровое изображение?

+3

Похоже, b/g/r заменены, вместо этого попробуйте BitmapPixelFormat.Bgra8. –

ответ

1

Решение:

Ну, я нашел решение этой проблемы, это было то, что я использовал BitmapPixelFormat.Rgba8 в PixelDataProvider (при выборке данных пикселей). Скорее я должен использовать BitmapPixelFormat. Bgra8.