图像奇怪的行为

时间:2015-06-13 11:17:49

标签: c# multithreading image

我看到一个奇怪的图像行为。

我有两种计算热图图像的方法。 一个方法在GUI线程中工作,另一个在后台线程中工作。 两种方法都应该相同,输出作为png似乎是好的。 GUI线程创建的图像能够加载,但是后台线程中创建的图像不能加载。

我将计算出的图像保存为硬盘驱动器上的文件并重新加载。 当我加载它并将其分配给图像源时,它不是null。但是当程序离开分配方法时,image.source为null。我不明白为什么。

这是代码:

private void LoadImageClicked(object sender, RoutedEventArgs e)
{
    this.ImageHeatMap.BeginInit();
    this.ImageHeatMap.Source = new BitmapImage(new Uri(@"HeatMapImage.png", UriKind.Relative));
    this.ImageHeatMap.EndInit();
}

这就是他如何将图像保存为png:

public void SaveFile(BitmapSource source, string filePath)
{
    using (var fileStream = new FileStream(filePath, FileMode.Create))
    {
        BitmapEncoder encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(source));
        encoder.Save(fileStream);
    }
}

有趣的是我无法在调试模式下查看Image.Source.Height属性。但是使用工作文件,我能够读取此属性。 调试看起来像这样:

Debug of Image.Source assignment

英文错误消息(免费翻译):“this.Image:heatMap.Source.Height”抛出类型“System.IO.IOException”的异常

有人能帮我理解问题出在哪里?因为我不明白为什么我无法加载图像。我可以通过Windows图片浏览器打开它。

我认为问题是元数据,但我不知道 - 目前 - 如何解决它。

1 个答案:

答案 0 :(得分:-2)

对于.Net中的图像对象,我发现需要强制它被处理掉。使用操作图像的任何类的.Dispose()方法足以释放它对文件的保持。你会认为关闭Stream会强制推出这个版本,但事实并非如此。

编辑:由于你不理解回应,你投票很糟糕。我想删除我的回复,但我认为这不符合社区的利益。这是一篇相关文章,解释了我在进一步说的内容。

Fiddle