2017-02-05 21 views
0

Вопрос уже задан, но я не могу найти ответ.UWP/C# Вращающийся BMP

Я загружаю изображение BMP в память в приложении UWP, и я хотел бы повернуть его на 90, 180 или 270, но я просто не могу найти способ сделать это.

imgSource.rotate(), кажется, не существует больше RotateTransform работает с XAML ....

Можно ли добавить недостающий код, шанс, пожалуйста?

public async Task LoadImage() 
    { 
     StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync("test.bmp"); 
     using (var stream = await file.OpenAsync(FileAccessMode.Read)) 
     { 
      var decoder = await BitmapDecoder.CreateAsync(stream); 
      bitmap = await decoder.GetSoftwareBitmapAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied); 
      var imgSource = new WriteableBitmap(bitmap.PixelWidth, bitmap.PixelHeight); 

      // Code to rotate image by 180 to be added 

      bitmap.CopyToBuffer(imgSource.PixelBuffer); 
     } 
    } 

ответ

2

RotateTransform работает с XAML

Как известно, RotateTransform для поворота преобразования в UWP приложения XAML. A RotateTransform определяется Angle, который вращает объект по дуге вокруг точки CenterX, CenterY. Но преобразование обычно используется для заполнения свойства UIElement.RenderTransform, поэтому, если вы загружаете источник изображения в ImageControl, вы можете повернуть ImageControl, так как это UIElement. Например, если мы имеем ImageControl следующим образом:

<Image x:Name="PreviewImage" Height="400" Width="300" AutomationProperties.Name="Preview of the image" Stretch="Uniform" HorizontalAlignment="Center" VerticalAlignment="Center"/> 

Мы можем просто повернуть его angle собственности кодом, как:

RotateTransform m_transform = new RotateTransform(); 
PreviewImage.RenderTransform = m_transform; 
m_transform.Angle = 180; 

Если вам нужно повернуть файл не UIElement изображения, вам может понадобиться чтобы декодировать файл изображения как то, что вы уже сделали, а затем закодировать файл с настройкой свойства BitmapTransform.Rotation. Код выглядит следующим образом:

double m_scaleFactor; 
    private async void btnrotatefile_Click(object sender, RoutedEventArgs e) 
    { 
     StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync("test.bmp"); 
     using (IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.ReadWrite), 
             memStream = new InMemoryRandomAccessStream()) 
     { 
      BitmapDecoder decoder = await BitmapDecoder.CreateAsync(fileStream); 
      uint originalWidth = decoder.PixelWidth; 
      uint originalHeight = decoder.PixelHeight; 
      BitmapEncoder encoder = await BitmapEncoder.CreateForTranscodingAsync(memStream, decoder); 
      if (m_scaleFactor != 1.0) 
      { 
       encoder.BitmapTransform.ScaledWidth = (uint)(originalWidth * m_scaleFactor); 
       encoder.BitmapTransform.ScaledHeight = (uint)(originalHeight * m_scaleFactor); 
       encoder.BitmapTransform.InterpolationMode = BitmapInterpolationMode.Fant; 
      } 

     //Rotate 180 
      encoder.BitmapTransform.Rotation = BitmapRotation.Clockwise180Degrees; 
      await encoder.FlushAsync(); 
      memStream.Seek(0); 
      fileStream.Seek(0); 
      fileStream.Size = 0; 
      await RandomAccessStream.CopyAsync(memStream, fileStream); 
     } 
    } 

Больше возможностей о вращении файла изображения вы можете использовать другой APIS под Windows.Graphics.Imaging имен. И сценарий 2 официальной выборки SimpleImaging предоставляет полный образец поворота изображения, о котором вы можете обратиться.

+0

Это фантастика, работает как и ожидалось. Действительно, сценарий 2 был необходим. Большое вам спасибо. –