イメージ コントロールを含むビューがあります。
<Image
x:Name="img"
Height="100"
Margin="5"
Source="{Binding Path=ImageFullPath Converter={StaticResource ImagePathConverter}}"/>
バインディングは、「OnLoad」に設定する以外は何もしないコンバーターを使用するBitmapCacheOption
ため、ファイルを回転しようとするとファイルのロックが解除されます。
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
toを取得したときBitmapCacheOption.OnLoad
です。ファイルはロックされていませんが、回転すると常に画像が回転するとは限りません(毎回元のキャッシュされた値を使用していると思います)。
ファイルがロックされないように BitmapCacheOption.OnLoad を使用する場合、画像が回転した後に Image コントロールを更新するにはどうすればよいですか? 元の値はメモリにキャッシュされているようです。
現在ビューに表示されている画像を回転するためのより良い代替手段はありますか?