我有一个包含图像控件的 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/