WPF - 旋转和保存图像 - 用于 View 和磁盘

标签 wpf image controls rotation bitmapimage

我有一个包含图像控件的 View 。

<Image
x:Name="img"
Height="100"
Margin="5"
Source="{Binding Path=ImageFullPath Converter={StaticResource ImagePathConverter}}"/>

绑定(bind)使用了一个转换器,除了将 BitmapCacheOption 设置为“OnLoad”之外,它没有做任何有趣的事情,因此当我尝试旋转文件时文件被解锁。

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    // value contains the full path to the image
    string val = (string)value;

    if (val == null)
        return null;

    // load the image, specify CacheOption so the file is not locked
    BitmapImage image = new BitmapImage();
    image.BeginInit();
    image.CacheOption = BitmapCacheOption.OnLoad;
    image.UriSource = new Uri(val);
    image.EndInit();

    return image;
}

这是我旋转图像的代码。 val 始终为 90 或 -90,path 是我要旋转的 .tif 文件的完整路径。

internal static void Rotate(int val, string path)
{
    //cannot use reference to what is being displayed, since that is a thumbnail image.
    //must create a new image from existing file. 
    Image image = new Image();
    BitmapImage logo = new BitmapImage();
    logo.BeginInit();
    logo.CacheOption = BitmapCacheOption.OnLoad;
    logo.UriSource = new Uri(path);
    logo.EndInit();
    image.Source = logo;
    BitmapSource img = (BitmapSource)(image.Source);

    //rotate tif and save
    CachedBitmap cache = new CachedBitmap(img, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
    TransformedBitmap tb = new TransformedBitmap(cache, new RotateTransform(val));
    TiffBitmapEncoder encoder = new TiffBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(tb)); //cache
    using (FileStream file = File.OpenWrite(path))
    {
        encoder.Save(file);
    }
}

我遇到的问题是当我将 BitmapCacheOption 设置为 BitmapCacheOption.OnLoad 时,文件未锁定但是旋转并不总是旋转图像(我相信它每次都使用原始缓存值)。

如果我使用 BitmapCacheOption.OnLoad 所以文件没有被锁定,我如何在图像旋转后更新图像控件?原始值似乎缓存在内存中。

旋转当前显示在 View 中的图像是否有更好的选择?

最佳答案

又过了一年,我需要这样做并找到了 following solution :

如果你有一个图像元素:

<grid>
    <stackpanel>
        <Image Name="img" Source="01.jpg"/>
        <Button Click="Button_Click" Content="CLICK"/>
    </stackpanel>
</grid>

您可以在代码隐藏中旋转它:

private double rotateAngle = 0.0;
private void RotateButton_Click(object sender, RoutedEventArgs e)
{
    img.RenderTransformOrigin = new Point(0.5, 0.5);
    img.RenderTransform = new RotateTransform(rotateAngle+=90);
}

或者,假设您的图像元素名为 img:

private double RotateAngle = 0.0;
private void Button_Click(object sender, RoutedEventArgs e)
{
    TransformedBitmap TempImage = new TransformedBitmap();

    TempImage.BeginInit();
    TempImage.Source = MyImageSource; // MyImageSource of type BitmapImage

    RotateTransform transform = new RotateTransform(rotateAngle+=90);
    TempImage.Transform = transform;
    TempImage.EndInit();

    img.Source = TempImage ;
}

关于WPF - 旋转和保存图像 - 用于 View 和磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2723450/

相关文章:

html - 基于内容的网格列宽不起作用

controls - 如何使用 jQuery 查找某些特定的事件处理程序?

macos - Mac OS X 应用程序要使用哪些控件?

c# - 当列名称包含 '/' 时,为什么 DataTable 值不会显示在 WPF DataGrid 上?

c# - 如何更改 Xceed WPF DateTimePicker 日历的大小

wpf - 动态添加的 DataTemplate - 找不到用于转换器的静态资源

css - 不能超越 CSS 文本样式和图像向下移动吗?

PHP 脚本无法正确上传图片

vb.net - 从子 VB.NET 操作父窗体上的控件

c# - WPF ListView 样式