画像を任意の角度で回転させたい
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 23:16
2023/01/27 23:16