覆盖现有图像

时间:2012-01-18 05:43:20

标签: c# image bitmap

我有这段代码

    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();
    }

我的驱动器“c:\”已经有了 t.jpg 的图像。
我希望每次程序运行时都用新图像替换它。但是出现了GDI +错误 我怎么能解决它?

3 个答案:

答案 0 :(得分:34)

如果您的图片已经存在,则必须将其删除。

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();
    }

答案 1 :(得分:1)

我想您之前使用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覆盖文件。因此,您在问题中提供的代码应该可以正常工作。保存前无需删除原始文件或处理图像。

答案 2 :(得分:0)

private void saveImage(Image file, string filename){
    try
    {     
        if(Directory.Exists("filepath"+filename))
        {
            file.Dispose();
        }
        else
        {
            Directory.CreateDirectory("filepath"+filename);
            file.Save("filepath" + filename, Imageformat.Jpeg);
        }
    }   
    finally
    {
        file.Dispose();
    }           
}

这个对我有用。