画像を任意の角度で回転させたい
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