2017-02-05 45 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 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屬性對文件進行編碼。代碼如下:你可以使用下Windows.Graphics.Imaging命名空間其他API的圖像文件旋轉

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); 
     } 
    } 

更多功能。 SimpleImaging官方示例的場景2提供了一個關於您可以參考的圖像旋轉的完整示例。

+0

這是太棒了,按預期工作。確實情況2是需要的。謝謝你,謝謝你。 –