UWP / C#旋转BMP

时间:2017-02-05 22:21:15

标签: c# image rotation uwp bmp

似乎已经提出了这个问题,但我找不到相关的答案。

我在UWP应用程序中将BMP图像加载到内存中,我想将它旋转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);
        }
    }

1 个答案:

答案 0 :(得分:5)

  

RotateTransform适用于xaml

如您所知,RotateTransform适用于uwp应用XAML中的旋转变换。 RotateTransformAngle定义,它通过围绕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);
      }
  }

有关图像文件轮换的更多功能,您可以使用Windows.Graphics.Imaging命名空间下的其他APIS。 SimpleImaging 官方样本的方案2提供了有关您可以参考的图像旋转的完整示例。