覆盖现有的图像

28

我有这段代码

    private void saveImage()
    {
        Bitmap bmp1 = new Bitmap(pictureBox.Image);
        bmp1.Save("c:\\t.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
        // Dispose of the image files.
        bmp1.Dispose();
    }

我已经有一张图像t.jpg在我的驱动器"c:\"上。
每次运行我的程序时,我希望用新的图像替换它,但是会出现GDI+错误。
我该如何解决这个问题?


可能重复:https://dev59.com/g0jSa4cB1Zd3GeqPCyJo - Shoaib Shaikh
http://stackoverflow.com/questions/838063/overwriting-an-image-file-bitmap - Shoaib Shaikh
2个回答

42

如果该图片已经存在,您必须删除它。

private void saveImage()
    {
        Bitmap bmp1 = new Bitmap(pictureBox.Image);

       if(System.IO.File.Exists("c:\\t.jpg"))
              System.IO.File.Delete("c:\\t.jpg");

        bmp1.Save("c:\\t.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
        // Dispose of the image files.
        bmp1.Dispose();
    }

4
这个应该解决我的问题,但是在 System.IO.File.Delete 时出现了一个新的错误。它说:“由于文件正在被另一个进程使用,因此无法访问该文件”。 - Ozarraga_AB
你有没有与那个文件一起工作的其他代码部分? - Chuck Norris
这段代码是从程序开始运行时创建一个名为“img1”的位图对象,它的路径为“c:\t.jpg”。 - Ozarraga_AB
4
调用此方法之前,您必须处理 img1。 - Chuck Norris
在我的国家,经常发生停电的情况,这并不是最好的想法。 - Hassan Faghihi
1
你为什么要丢弃那张图片呢?你需要保存那张图片回到文件系统中吗? - Ciaran Gallagher

5

我猜你之前使用了Image.Load方法加载了c:\t.jpg图片。如果是这样,那么Image对象正在保持该图像文件的打开文件句柄,这意味着文件无法被覆盖。

不要使用Image.Load获取原始图像,而是从你创建并处理过的FileStream中加载它。

因此,不要使用以下方式:

Image image = Image.Load(@"c:\\t.jpg");

执行以下操作:

using(FileStream fs = new FileStream(@"c:\\t.jpg", FileMode.Open))
{
    pictureBox.Image = Image.FromStream(fs);
    fs.Close();
}

文件句柄已释放,因此使用Bitmap.Save覆盖文件应该成功。您在问题中提供的代码应该可以正常工作。在保存之前无需删除原始文件或处理图像。
另外: 如果像上面那样关闭FileStream,则调用Image.Save将抛出异常。参见这里:Bitmap.Save方法中GDI+出现通用错误

这应该是被接受的答案! - TaW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接