【问题标题】:C# WPF deleting images after use [duplicate]C# WPF在使用后删除图像[重复]
【发布时间】:2014-02-10 13:10:41
【问题描述】:

我有一个打开网络摄像头并拍摄条形码照片的设备;这部分工作正常,但我现在想在屏幕上显示拍摄的照片。

我在axml文件中创建了图片控件如下:

<Image x:Name="BarcodeImage" Margin="5" Height="240" Width="450"/>

如您所见,我实际上还没有设置图像,因为没有可显示的内容。

拍完照片后,我将图像保存到硬盘;这可以正常工作,因为我可以从我的电脑查看图像。

然后我在代码中设置图像如下:

this.BarcodeImage.Source = new BitmapImage(new Uri(filename));

这可以正常工作,我现在可以在屏幕上看到拍摄的图像。

如果我想扫描不同的条形码,就会出现问题;我无法保存下一张拍摄的照片,因为文件名已经存在,所以我试图在保存下一张之前删除这张照片,但我不断收到错误消息“该文件可能正在被另一个进程使用”。

我尝试在删除之前设置一个默认图像(希望我要删除的图像现在没有被使用),但是现在两个图像都无法删除(即使是手动),因为它们都被另一个图像使用过程。

我也尝试将 image.source 设置为 null,但这也不起作用。

您对如何删除图像或清除当前图像集有什么建议吗?

【问题讨论】:

    标签: c# wpf image


    【解决方案1】:

    当您直接从文件加载BitmapImage 时,文件会被锁定,直到图像被释放。为避免这种情况,最简单的方法是从流中加载图像,并将CacheOption 设置为OnLoad

    using (var stream = File.OpenRead(filename))
    {
        var bmp = new BitmapImage();
        bmp.BeginInit();
        bmp.StreamSource = stream;
        bmp.CacheOption = BitmapCacheOption.OnLoad;
        bmp.EndInit();
        this.BarcodeImage.Source = bmp;
    }
    

    【讨论】:

    • 在调用EndInit并关闭流之前,还需要设置bmp.CacheOption = BitmapCacheOption.OnLoad
    • @Clemens,好点子。我编辑了我的答案。
    • 我正要回复说,使用此代码它只显示一个白框,但已看到代码已被编辑,并且使用此额外行代码可以正常工作。感谢您的帮助。
    猜你喜欢
    • 2021-11-25
    • 1970-01-01
    • 2015-08-30
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多