【问题标题】:Releasing Bitmap from system memory to delete it C#从系统内存中释放位图以将其删除 C#
【发布时间】:2019-04-17 13:35:17
【问题描述】:

我正在尝试比较两张图片,如果它们是同一张图片,则删除第二张。当我的程序去删除一个文件时,它会抛出一个错误:The process cannot access the file "C:\Temp\Image.jpg" because it is being used by another process

这种方法不关闭位图文件似乎是一个问题,但我还没有找到一种方法从系统内存中释放位图以将其删除

    public static bool ImageCompareString(Bitmap firstImage, Bitmap secondImage)
    {
        MemoryStream ms = new MemoryStream();
        firstImage.Save(ms, ImageFormat.Png);
        string firstBitmap = Convert.ToBase64String(ms.ToArray());
        ms.Position = 0;

        secondImage.Save(ms, ImageFormat.Png);
        string secondBitmap = Convert.ToBase64String(ms.ToArray());

        if (firstBitmap.Equals(secondBitmap))
        {
            ms.Close();
            return true;
        }
        else 
        {
            ms.Close();
            return false;
        }
    }

【问题讨论】:

  • 你也应该熟悉IDisposable,看看What are the uses of “using” in C#的介绍。
  • 您应该更改的代码超出了此范围。向我们展示这是如何调用的(使用加载位图的代码)
  • J.范朗根是正确的;显示的代码不是发生问题的代码。那将是打开和删除图像的代码。作为旁注,您为什么要将它们作为字符串进行比较?只需使用字节数组本身并使用.SequenceEquals()。对这样的东西使用字符串操作通常是一种肮脏的程序员捷径,在处理级别上非常昂贵。

标签: c# image memory bitmap


【解决方案1】:

在删除实际文件之前处理第二个图像的位图对象。所以像'secondImage.Dispose()'

【讨论】:

  • 或者,更理智的方式:使用using 块中的图像,以便对象在其范围结束时自动处理。它具有自动清理的额外优势,以防发生任何类型的异常。
【解决方案2】:

我建议使用 try cach 并运行 dispose 来释放 finnaly 部分的资源。即使抛出异常,这也会释放对象:

    public static bool ImageCompareString(Bitmap firstImage, Bitmap secondImage)
{
    try
    {
        MemoryStream ms = new MemoryStream();
        firstImage.Save(ms, ImageFormat.Png);
        string firstBitmap = Convert.ToBase64String(ms.ToArray());
        ms.Position = 0;

        secondImage.Save(ms, ImageFormat.Png);
        string secondBitmap = Convert.ToBase64String(ms.ToArray());

        if (firstBitmap.Equals(secondBitmap))
        {
            return true;
        }
        else 
        {           
            return false;
        }
    } 
    catch(Exception ex)
    {
        //log it, display or whatever
    } 
    finnaly 
    {
        ms.Close();
        ms.Dispose();
    }

}

【讨论】:

  • 无关;它在上崩溃的删除代码甚至不在显示的代码中。
猜你喜欢
  • 2017-03-01
  • 1970-01-01
  • 2012-08-29
  • 2019-05-12
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多