2017-02-05 23 views
0

質問はすでに質問されているようですが、関連する回答は見つかりません。UWP/C#回転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); 
     } 
    } 

答えて

2

RotateTransformは、XAMLあなたが知られているように

RotateTransformで動作する回転がUWPアプリのXAMLに変換するためにあります。 A RotateTransformは、点CenterX、CenterYを中心とする円弧を介してオブジェクトを回転させるAngleによって定義されます。しかし、変換は通常UIElement.RenderTransformプロパティを塗りつぶすために使用されるので、画像ソースをImageControlにロードすると、なのでImageControlを回転できます。たとえば、次のように我々はImageControlを持っている場合:

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

を私たちは、単にコードでangleプロパティでそれを回転させることができます:あなたがいないUIElement画像ファイルを回転させる必要がある場合は

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

、あなたが必要があるかもしれませんイメージファイルをデコードしてから、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が必要でした。 Sunteenありがとうございます。 –