位图已删除但仍可见?

时间:2013-05-15 23:27:01

标签: c# image file

我有一个返回BitmapImage的函数:

    private BitmapImage dfa2bmp(DFA dfa)
    {
        //[...]
        //myGraph.png generated here[...]
        BitmapImage bmp = new BitmapImage();
        bmp.BeginInit();
        bmp.CacheOption = BitmapCacheOption.OnLoad;
        bmp.UriSource = new Uri(graphvizDir + "\\myGraph.png");
        bmp.EndInit();
        File.Delete(graphvizDir + "\\myGraph.png");

        return bmp;
    }

所以在每次调用之后,文件myGraph.png都不同了。但是,当我将dfa2bmp的返回值分配给Image控件时,我仍然会获得旧图像,即使它在上一次调用我的函数时被删除了。

我做错了什么?

2 个答案:

答案 0 :(得分:0)

bmp.CacheOption = BitmapCacheOption.OnLoad;这一行将图像缓存在RAM中,然后从那里显示它。文档说;

在加载时将整个映像缓存到内存中。所有图像数据请求都从内存存储器中填充。

如果要阻止程序在删除后使用该图像,请将BitmapCacheOption更改为none。所以; bmp.CacheOption = BitmapCacheOption.None;会做你想做的事。

编辑:我不知道这会产生什么副作用,我并没有真正处理这些库,但是当你尝试将删除的图像分配给图像控件时,我发现有一些异常可能。我认为更好的解决方案可能是将对象设置为null,这将导致GC释放包含图像的内存。

答案 1 :(得分:0)

您需要将BitmapCreateOptions设置为IgnoreImageCache

  bmp.CreateOptions = BitmapCreateOptions.IgnoreImageCache;

如果您有需要刷新的图片,请使用BitmapCreateOptions.IgnoreImageCache

    // Summary:
    //     Loads images without using an existing image cache. This option should only
    //     be selected when images in a cache need to be refreshed.
    IgnoreImageCache = 8,