覆盖现有图像

Oza*_*_AB 24 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();
    }
Run Code Online (Sandbox Code Playgroud)

我已经在我的驱动器"c:\"上有一个图像t.jpg. 我希望每次程序运行时都用新图像替换它.但是GDI +错误显示 我怎么能解决它?

Chu*_*ris 36

如果图像已存在,则必须将其删除.

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();
    }
Run Code Online (Sandbox Code Playgroud)

  • 您必须在调用此方法之前调用img1. (4认同)
  • 这应该可以解决我的问题,但是在System.IO.File.Delete中出现了一个新的错误。它说:*该进程无法访问该文件,因为该文件正在被另一个进程使用* (3认同)

Adr*_*gat 6

我假设您之前使用 Image.Load 方法加载了 c:\t.jpg 图像。如果是这样,则 Image 对象持有图像文件的打开文件句柄,这意味着该文件无法被覆盖。

不要使用 Image.Load 获取原始图像,而是从您创建和处置的 FileStream 加载它。

所以,而不是

Image image = Image.Load(@"c:\\t.jpg");
Run Code Online (Sandbox Code Playgroud)

做这个:

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

文件句柄已被释放,因此使用 Bitmap.Save 覆盖文件可以成功。因此,您在问题中给出的代码应该有效。保存前无需删除原始文件或处理图像。

另外:如果像上面那样关闭 FileStream,则调用 Image.Save 将引发异常。请参阅此处:GDI+ 中 Bitmap.Save 方法发生一般错误