2017-01-10 35 views
0

キャンバスに別の画像を描画して、キャンバスにコラージュをpngファイルとして保存しようとしています。私の問題は翻訳が正しくないということです。例えば。位置xが600の場合、画像は〜550で描画されます。何か案は?WPFでコラージュを作成 - 固定位置、中心を中心に回転

 System.Windows.Controls.Image img = new System.Windows.Controls.Image(); 
     img.Source = new BitmapImage(new System.Uri(System.Environment.CurrentDirectory + "/" + filename, System.UriKind.RelativeOrAbsolute)); 
     img.RenderTransformOrigin = new System.Windows.Point(0.5, 0.5); 

     TransformGroup tg = new TransformGroup(); 
     double scaleX = (double)w/(double)img.Source.Width; 
     double scaleY = (double)h/(double)img.Source.Height; 
     tg.Children.Add(new ScaleTransform(scaleX, scaleY)); 
     tg.Children.Add(new RotateTransform(b.Rotation)); 
     tg.Children.Add(new TranslateTransform(x, y)); 
     img.RenderTransform = tg; 
     canvas.Children.Add(img); 

     double dpi = 96d; 
     RenderTargetBitmap rtb = new RenderTargetBitmap(1700, 1200, dpi, dpi, System.Windows.Media.PixelFormats.Default); 
     canvas.UpdateLayout(); 

     rtb.Render(canvas); 

     BitmapEncoder pngEncoder = new PngBitmapEncoder(); 
     pngEncoder.Frames.Add(BitmapFrame.Create(rtb)); 
     using (var fs = System.IO.File.OpenWrite("test.png")) 
     { 
      pngEncoder.Save(fs); 
     } 

EDIT:RenderTransformOriginの問題が発生します。位置を変えずにイメージセンターを中心にどのように回転できますか?

+0

TransformGroupはどこに適用されますか?なぜあなたは単に 'rtb.Render(canvas)'を呼び出すことができるDrawingVisualとVisualBrushを使っていますか? – Clemens

+0

あなたは正しいです。 'DrawingVisual'は必要ありません。私はそれを削除した。 'RenderTransformOrigin'を設定するとすぐに問題が発生します – daniel

+0

TransformGroupのトランスフォームの順序を変更してみてください。つまり、最初にrotateしてからtranslateしてみてください。 – Clemens

答えて

0

解決策はまずスケールを行い、次にピクセルベースの中心パラメータを使用して回転し、次に変換を行いました。また、TransformOriginは設定しないでください!

 System.Windows.Controls.Image img = new System.Windows.Controls.Image(); 
     img.Source = new BitmapImage(new System.Uri(System.Environment.CurrentDirectory + "/" + filename, System.UriKind.RelativeOrAbsolute)); 

     TransformGroup tg = new TransformGroup(); 
     double scaleX = (double)w/(double)img.Source.Width; 
     double scaleY = (double)h/(double)img.Source.Height; 
     tg.Children.Add(new ScaleTransform(scaleX, scaleY)); 
     tg.Children.Add(new RotateTransform(b.Rotation, w/2, h/2)); 
     tg.Children.Add(new TranslateTransform(x, y)); 
     img.RenderTransform = tg; 
     canvas.Children.Add(img); 

     double dpi = 96d; 
     RenderTargetBitmap rtb = new RenderTargetBitmap(1700, 1200, dpi, dpi, System.Windows.Media.PixelFormats.Default); 
     canvas.UpdateLayout(); 

     rtb.Render(canvas); 

     BitmapEncoder pngEncoder = new PngBitmapEncoder(); 
     pngEncoder.Frames.Add(BitmapFrame.Create(rtb)); 
     using (var fs = System.IO.File.OpenWrite("test.png")) 
     { 
      pngEncoder.Save(fs); 
     } 
関連する問題