如何在WPF中多次旋转图像

时间:2016-05-18 16:27:24

标签: c# wpf image rotation

我用打开的文件对话框打开了一张图片。

image.Source = new BitmapImage(new Uri(ofd.FileName));

然后我想根据自己的喜好旋转它,最后保存修改过的图像。问题是来自MSDN的代码:

var biOriginal = (BitmapImage)image.Source;
var biRotated = new BitmapImage();
biRotated.BeginInit();
biRotated.UriSource = biOriginal.UriSource;
biRotated.Rotation = Rotation.Rotate90;
biRotated.EndInit();
image.Source = biRotated;

我可以旋转图像,但只有一次,我无法保存旋转的图像。

2 个答案:

答案 0 :(得分:3)

如果我没弄错的话,你只需旋转图像即可。您可以通过将布局转换应用于XAML中的Image元素并在按钮单击时更改它的(转换)角度值来实现此目的。此外,您似乎没有关注MVVM。如果你这样做,看看它有多简单:

查看

<Image Source="C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg" 
    HorizontalAlignment="Center" VerticalAlignment="Center" Width="125">
        <Image.LayoutTransform>
            <RotateTransform Angle="{Binding RotateAngle}" />
        </Image.LayoutTransform>
</Image>
<Button Content="Rotate" Command="{Binding RotateCommand}" 
    VerticalAlignment="Bottom" HorizontalAlignment="Center" />

<强>视图模型

public class ViewModel : BaseViewModel
{
    private ICommand rotateCommand;
    private double rotateAngle;

    public ICommand RotateCommand
    {
        get
        {
            if(rotateCommand == null)
            {
                rotateCommand = new RelayCommand(() => {
                    RotateAngle += 90;
                });
            }

            return rotateCommand;
        }
    }

    public double RotateAngle
    {
        get
        {
            return rotateAngle;
        }

        private set
        {
            if(value != rotateAngle)
            {
                rotateAngle = value;
                OnPropertyChanged("RotateAngle");
            }
        }
    }
}

查看代码隐藏

ViewModel vm;

public View()
{
    InitializeComponent();
    vm = new ViewModel();
    DataContext = vm;
}

enter image description here

我假设你不是MVVM / WPF中的绝对初学者,并且省略了BaseViewModel(实现INotifyPropertyChanged)和RelayCommand(实现ICommand)的定义,因为我不想让答案过于冗长。如果您遇到这些问题,请告诉我,我会将它们包括在内。

答案 1 :(得分:-1)

以下代码似乎有效:

            BitmapImage newImage = new BitmapImage();
        newImage.BeginInit();
        newImage.UriSource = MyImage.UriSource;
        newImage.Rotation = Rotation.Rotate90;
        newImage.EndInit();
        JpegBitmapEncoder encoder = new JpegBitmapEncoder();
        string ImageName = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), (Guid.NewGuid() + ".jpg"));
        encoder.Frames.Add(BitmapFrame.Create(newImage));

        using (var filestream = new FileStream(ImageName, FileMode.Create))
            encoder.Save(filestream);
        MyImage = new BitmapImage(new Uri(ImageName));

每当你旋转它时,它会创建一个新的图像,如果你想要多次旋转图像并保存一次我没有找到一个简单的方法来进行多次旋转而不保存旋转的图像。 / p>