无法解锁图片框中使用的图像

本文关键字:图像 解锁 | 更新日期: 2023-09-27 17:56:05

我需要移动/重命名一些加载在图片框中的图像,这些图像存储在应用程序可执行路径中的文件夹中。在我可以移动/重命名任何图像之前,我必须确保它未被使用,因此我尝试将另一个图像从应用程序的可执行路径加载到此图片框中,并尝试"空"图片框图像属性。

如果我想继续我的程序,图像仍然被锁定,我使用以下代码验证了这一点:

protected virtual bool IsFileLocked(FileInfo file)
    {
        FileStream stream = null;
        try
        {
            stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None);
        }
        catch (IOException)
        {
            return true;
        }
        finally
        {
            if (stream != null)
                stream.Close();
        }
        return false;
    }

我还尝试使用此处的代码:什么进程锁定文件?

这给我返回了以下内容:System.Collections.Generic.List'1[System.Diagnostics.Process]

我必须告诉你,我也在使用相同的图像和方法与AccessViolationException作斗争。我不完全确定这是否是同样的问题...是我保存图像的方式错误还是我使用它们的方式错误?如果您需要更多代码或信息,请告诉我!

编辑:

TaW 的链接和 Anon Coward 的答案都对我不起作用,我真的尽了最大的努力让它工作,我试图处理和清空图片框、图像等。我找到了一个与您的建议混合的解决方案,但这是一个非常肮脏的解决方案......

var image2 = Image.FromFile(infos[i].FullName);
                                MemoryStream ms = new MemoryStream();
                                if (ImageFormat.Jpeg.Equals(image2.RawFormat))
                                {
                                    // JPEG
                                    image2.Save(ms, ImageFormat.Jpeg);
                                }
                                else if (ImageFormat.Png.Equals(image2.RawFormat))
                                {
                                    // PNG
                                    image2.Save(ms, ImageFormat.Png);
                                }
                                else if (ImageFormat.Gif.Equals(image2.RawFormat))
                                {
                                    // Bitmap
                                    image2.Save(ms, ImageFormat.Bmp);
                                }
                                else if (ImageFormat.Icon.Equals(image2.RawFormat))
                                {
                                    // Icon
                                    image2.Save(ms, ImageFormat.Icon);
                                }
                                image2.Dispose();
                                System.GC.Collect();
                                System.GC.WaitForPendingFinalizers();
                                System.IO.File.Delete(infos[i].FullName);
                                Image newImg = Image.FromStream(ms);
                                newImg.Save(neuer_name2);
                                newImg = null;

我知道使用垃圾收集不是正确的方法,但我不知道是什么阻止了图像......所以我仍在这里寻找真正的解决方案。

无法解锁图片框中使用的图像

将属性设置为 null 时,仅在将来的某个时间点将

对象标记为可用于垃圾回收,因此对象的文件句柄将保持打开状态,直到将来的某个时间点。

如果计划修改文件,则需要执行两项操作:两者都使属性为 Null,以便 PictureBox 不会尝试使用它,以及释放图像本身,以便关闭文件句柄:

var image = pictureBox1.Image;
pictureBox1.Image = null;
image.Dispose();

此外,您可能会遇到 GDI+ 问题。 首先需要防止 Image 构造函数保留对文件的引用,您可以通过先将其读入 MemoryStream 然后将其传递给构造函数来轻松执行此操作:

Image image = Image.FromStream(new MemoryStream(File.ReadAllBytes("test.png")))