3

イメージ コントロールを含むビューがあります。

<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);
    }
}

私が経験している問題は、BitmapCacheOptiontoを取得したときBitmapCacheOption.OnLoadです。ファイルはロックされていませんが、回転すると常に画像が回転するとは限りません(毎回元のキャッシュされた値を使用していると思います)。

ファイルがロックされないように BitmapCacheOption.OnLoad を使用する場合、画像が回転した後に Image コントロールを更新するにはどうすればよいですか? 元の値はメモリにキャッシュされているようです。

現在ビューに表示されている画像を回転するためのより良い代替手段はありますか?

4

1 に答える 1