调整图片大小后覆盖同名原文件时GDI+报错的技术问询
解决GDI+覆盖图片文件时的ExternalException问题
你的判断没错,这个错误确实是因为PictureBox控件仍持有原图片的文件句柄,导致文件被锁定无法覆盖写入。以下是几种直接可行的解决方法:
先释放PictureBox的图片资源
在执行保存操作前,先手动释放PictureBox绑定的原图片,确保文件句柄被释放:if (yourPictureBox.Image != null) { yourPictureBox.Image.Dispose(); yourPictureBox.Image = null; }执行完这段代码后,原图片文件就不再被锁定,此时调用
bmpResized.Save(images[i])就能正常覆盖。改用内存流加载图片,避免锁定文件
如果你的PictureBox是通过Image.FromFile()直接加载文件的,这种方式会长期锁定原文件。改成用内存流加载,从根源避免文件锁定:// 加载图片到PictureBox时使用内存流 using (FileStream fs = new FileStream(images[i], FileMode.Open, FileAccess.Read)) { yourPictureBox.Image = Image.FromStream(fs); }这种方式下,文件只会在读取时被短暂占用,读取完成后句柄就会释放,后续覆盖操作不会受影响。
覆盖后重新加载图片到PictureBox
不管用哪种方法,覆盖完成后记得重新把新图片加载到PictureBox,恢复界面显示:using (FileStream fs = new FileStream(images[i], FileMode.Open, FileAccess.Read)) { yourPictureBox.Image = Image.FromStream(fs); }
GDI+的这类通用错误大多和资源句柄未释放、文件被锁定有关,核心思路就是确保写入操作时,原文件没有被任何进程(包括当前程序的控件)占用。
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

