質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

1696閲覧

画像を任意の角度で回転させたい

byori

総合スコア71

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

0クリップ

投稿2023/01/27 07:20

実現したいこと

画像を回転したくて下記のコードで試しました。
回転角度は、45°、90°などでなく任意の double です。

以前のWinForm で使用したコードをWPFに置き換え用としていますが、下記のエラーでうまくいきません
WPFではどのようにするか教えてください

発生している問題・エラーメッセージ

catch (Exception ex) { } 「変換は、拡大縮小、反転、および 90 度回転の組み合わせでなければなりません。」というエラーがでます。 エラー番号は、吐かれていません。

該当のソースコード

C#(WinForm)

1 public static Bitmap RotateBitmap(Bitmap bmp, float angle, int x, int y) 2 { 3 Bitmap bmp2 = new Bitmap((int)bmp.Width, (int)bmp.Height); 4 Graphics g = Graphics.FromImage(bmp2); 5 g.Clear(Color.White); 6 7 g.ResetTransform(); // TranslateTransform(-x, -y); 8 g.RotateTransform(angle, System.Drawing.Drawing2D.MatrixOrder.Append); 9 g.TranslateTransform(x, y, System.Drawing.Drawing2D.MatrixOrder.Append); 10 11 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear; 12 13 g.DrawImageUnscaled(bmp, 0, 0); 14 g.Dispose(); 15 16 return bmp2; 17 }

wpf(C#)

1double imageShokenRotate = 0.3; 2 3 // 画像を回転して補正 4 var transformedBitmap = new TransformedBitmap(); 5 transformedBitmap.BeginInit(); 6 transformedBitmap.Source = sGazo; 7 //transformedBitmap.Transform = new RotateTransform(imageShokenRotate, sGazo.Width / 2, sGazo.Height / 2); 8 RotateTransform abc = new RotateTransform(); 9 abc.Angle = imageShokenRotate; 10 abc.CenterX = sGazo.Width / 2; 11 abc.CenterY = sGazo.Height / 2; 12 transformedBitmap.Transform = abc; 13 14 transformedBitmap.EndInit();   <- ここでエラー

補足情報(FW/ツールのバージョンなど)

Windows11 VS2019 WPF C#

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

画像を任意の角度で回転させたい

WPFの場合Image自体を回してしまえばほぼ用が済むため、画像そのものの回転例って見つけにくいですね...

いくつか試したところ、DrawingContextでやるのが自由度が高そうでした。
DrawingContext クラス (System.Windows.Media) | Microsoft Learn

ほぼコンパチにしたつもりですが、あまりわかってないので間違っていたらすいません。

xml

1<Window 2 x:Class="Qesstnak6tkab7r.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Width="600" 6 SizeToContent="Height" 7 Slider.ValueChanged="ValueChanged"> 8 <StackPanel> 9 <UniformGrid Height="200" Background="LightGray" Rows="1"> 10 <HeaderedContentControl HorizontalAlignment="Center" VerticalAlignment="Center" Header="original"> 11 <Image x:Name="image1" Source="https://teratail-v2.storage.googleapis.com/uploads/avatars/u14/141642/L2BhZF1d_thumbnail.jpg" Stretch="None" /> 12 </HeaderedContentControl> 13 14 <HeaderedContentControl HorizontalAlignment="Center" VerticalAlignment="Center" Header="BitmapSource Rotate"> 15 <Image x:Name="image2" Stretch="None" /> 16 </HeaderedContentControl> 17 18 <HeaderedContentControl HorizontalAlignment="Center" VerticalAlignment="Center" Header="Image Rotate"> 19 <Grid 20 HorizontalAlignment="Center" 21 VerticalAlignment="Center" 22 Background="White" 23 ClipToBounds="True"> 24 <Image Source="https://teratail-v2.storage.googleapis.com/uploads/avatars/u14/141642/L2BhZF1d_thumbnail.jpg" Stretch="None"> 25 <Image.RenderTransform> 26 <TransformGroup> 27 <RotateTransform Angle="{Binding Value, ElementName=angle}" /> 28 <TranslateTransform X="{Binding Value, ElementName=x}" Y="{Binding Value, ElementName=y}" /> 29 </TransformGroup> 30 </Image.RenderTransform> 31 </Image> 32 </Grid> 33 </HeaderedContentControl> 34 </UniformGrid> 35 36 <HeaderedContentControl Margin="10" Header="angle"> 37 <Slider x:Name="angle" Maximum="360" /> 38 </HeaderedContentControl> 39 <HeaderedContentControl Margin="10" Header="x"> 40 <Slider x:Name="x" Maximum="100" Minimum="-100" /> 41 </HeaderedContentControl> 42 <HeaderedContentControl Margin="10" Header="y"> 43 <Slider x:Name="y" Maximum="100" Minimum="-100" /> 44 </HeaderedContentControl> 45 </StackPanel> 46</Window>

cs

1using System.Windows; 2using System.Windows.Media; 3using System.Windows.Media.Imaging; 4 5namespace Qesstnak6tkab7r 6{ 7 public partial class MainWindow : Window 8 { 9 public MainWindow() => InitializeComponent(); 10 11 private void ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) 12 { 13 if (image1.Source is BitmapSource bmp) 14 { 15 image2.Source = RotateBitmap(bmp, angle.Value, x.Value, y.Value); 16 } 17 } 18 19 private static BitmapSource RotateBitmap(BitmapSource bmp, double angle, double x, double y) 20 { 21 var drawingVisual = new DrawingVisual(); 22 using (var drawingContext = drawingVisual.RenderOpen()) 23 { 24 drawingContext.DrawRectangle(Brushes.White, null, new Rect(0, 0, bmp.PixelWidth, bmp.PixelHeight)); 25 drawingContext.PushTransform(new TranslateTransform(x, y)); 26 drawingContext.PushTransform(new RotateTransform(angle)); 27 drawingContext.DrawImage(bmp, new Rect(0, 0, bmp.PixelWidth, bmp.PixelHeight)); 28 } 29 30 var bmp2 = new RenderTargetBitmap(bmp.PixelWidth, bmp.PixelHeight, 96, 96, PixelFormats.Default); 31 bmp2.Render(drawingVisual); 32 bmp2.Freeze(); 33 return bmp2; 34 } 35 } 36}

アプリ画像

投稿2023/01/27 09:56

編集2023/01/27 23:45
TN8001

総合スコア9326

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

byori

2023/01/27 23:16

TN8001 様、いつもお世話にあります。 完璧なコードです。 DrawingVisual() は、勉強になります。ありがとうございます。
TN8001

2023/01/27 23:16

> WPFの場合Image自体を回してしまえばほぼ用が済むため の例追加
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問