旋转并自动缩放图片

时间:2017-09-03 14:27:14

标签: c# wpf

在我的WPF应用程序中,我想要旋转放置在网格单元格中的图像:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="50"/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <Button Name="btnRotate" Click="btnRotate_Click">Rotate</Button>
    <Image Grid.Row="1" Name="img" RenderTransformOrigin="0.5,0.5" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" />
</Grid>

我尝试了两个想法:

  • 直接在RotateTransform容器上使用Image。遗憾的是,此转换会取消容器的属性VerticalAlignment="Stretch" HorizontalAlignment="Stretch",并且图像超出了单元格边框。
  • RotateTransform图片实例上使用TransformedBitmap。这个结构可以完美地旋转和自动旋转,但GC不会收集旧实例;所以它浪费了很多RAM功能。

这是我的第二个想法背后的代码。如果它不会浪费那么多RAM,那就没关系了。

private void btnRotate_Click(object sender, RoutedEventArgs e)
{
    bmp = new TransformedBitmap(bmp, new RotateTransform(90));
    bmp.Freeze();
    img.Source = bmp;
}

那么,在布局容器中使用自动缩放旋转图像的最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用LayoutTransform而不是RenderTransform。在WPF已经计算出各个对象的所有大小,位置和度量之后,RenderTransform中的转换将被应用,而LayoutTransform组中的转换将在WPF执行所有这些计算之前应用。

答案 1 :(得分:0)

要旋转图像,最好的方法是让WPF完成工作并使用LayoutTransform。

在XAML中,您必须使用Rotation信息添加Image.LayoutTranform标记:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="50"/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <Button Name="btnRotate" Click="btnRotate_Click">Rotate</Button>
    <Image Grid.Row="1" Name="img" RenderTransformOrigin="0.5,0.5" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
        <Image.LayoutTransform>
            <RotateTransform Angle="0"/>
        </Image.LayoutTransform>
    </Image>
</Grid>

在C#中,您现在可以更改点击操作中的旋转:

    private void btnRotate_Click(object sender, RoutedEventArgs e)
    {
        double rotation = (double)img.LayoutTransform.GetValue(RotateTransform.AngleProperty);
        rotation += 90;
        img.LayoutTransform.SetValue(RotateTransform.AngleProperty, rotation % 360);
    }