首页 > 解决方案 > 当 ImageSource 需要为字符串时,WPF 旋转 Image 标签的 Source

问题描述

我有我的图像标签代码:

                        
<Image Source="{Binding ImageSource}">                        
    <Image.LayoutTransform>                              
        <RotateTransform Angle="{Binding RotateAngle}" />
    </Image.LayoutTransform>                             
</Image>                                                 
                   

我正在旋转图像标签。我RotateAngle<RotateTransform Angle="{Binding RotateAngle}" />.

一切正常:

在此处输入图像描述

但是如何使Image标签保持在相同的位置(如屏幕上的第二和第三位置)并且仅Source在我的Image翻转(Source="{Binding ImageSource})中?

我可以做这个:

  1. 加载ImageSourceSystem.Drawing.Bitmap(现在它是一个字符串)
  2. 写类似:
    Bitmap.RotateFlip(rotateFlipType);
    ImageSource = ImageUtilities.BitmapToBitmapSource(Bitmap);
    
  3. 从 xaml 和 csharp 代码中删除RotateAngle(现在不需要)

一切都会正常工作:

在此处输入图像描述

但就我而言,我不想ImageSource成为一个字符串Bitmap。如何Image Source只旋转而不创建Bitmap/BitmapImage/BitmapSource对象?

标签: c#wpfxaml

解决方案


如果您只想旋转 90° 的倍数,则可以使用 TransformedBitmap。

修改您的视图模型,如下所示,并绑定到它的RotatedImage属性,如

<Image Source="{Binding RotatedImage}">

查看模型

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private BitmapSource imageSource;
    private double rotateAngle;

    public BitmapSource ImageSource
    {
        get { return imageSource; }
        set
        {
            imageSource = value;
            PropertyChanged?.Invoke(
                this, new PropertyChangedEventArgs(nameof(ImageSource)));
            PropertyChanged?.Invoke(
                this, new PropertyChangedEventArgs(nameof(RotatedImage)));
        }
    }

    public double RotateAngle
    {
        get => rotateAngle;
        set
        {
            rotateAngle = value;
            PropertyChanged?.Invoke(
                this, new PropertyChangedEventArgs(nameof(RotateAngle)));
            PropertyChanged?.Invoke(
                this, new PropertyChangedEventArgs(nameof(RotatedImage)));
        }
    }

    public BitmapSource RotatedImage
    {
        get
        {
            return new TransformedBitmap(
                ImageSource, new RotateTransform(RotateAngle));
        }
    }
}

推荐阅读