C#Image.FromFile“正在使用”解决方法?

时间:2018-11-07 14:23:38

标签: c#

我正在开发一个程序,您可以在其中更改主窗体“ Form1”的墙纸 从“选项”表单中。在“选项”表单上,有一个openfile对话框,您可以在其中选择图像,然后将图像复制到应用程序目录中。

    private void wallpaperBrowser_Click(object sender, EventArgs e)
    {
        wallpaperOptioncolor.Visible = false;
        OpenFileDialog of = new OpenFileDialog();
        of.Title = "Select Image";
        of.Filter = "Image Files (*.jpg;*.jpeg,*.png,*.gif)|*.JPG;*.JPEG;*.PNG;*.GIF";
        if (of.ShowDialog() == DialogResult.OK)
        {
            File.Copy(of.FileName, Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\DesktopReborn\\CurrentWallpaper.png", true);

            (this.Owner as Form1).mainBackground.Image = new Bitmap(of.FileName);
            (this.Owner as Form1).BackgroundImage = new Bitmap(of.FileName);
            currentWallpaper.BackgroundImage = (this.Owner as Form1).mainBackground.Image;

            (this.Owner as Form1).BackgroundImageLayout = ImageLayout.Stretch;
            (this.Owner as Form1).mainBackground.SizeMode = PictureBoxSizeMode.StretchImage;
        }
    }

然后在主窗体的load事件上,检查文件“ CurrentWallpaper.png”是否存在。如果确实存在,它将设置墙纸,但是如果您尝试更改墙纸,则会出现错误。

“ System.IO.IOException:'该进程无法访问文件'C:\ Users \ mc_jgeorgio20 \ Documents \ DesktopReborn \ CurrentWallpaper.png',因为它正在被另一个进程使用。'

        if (File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\DesktopReborn\\CurrentWallpaper.png"))
        {
            BackgroundImageLayout = ImageLayout.Stretch;
            mainBackground.SizeMode = PictureBoxSizeMode.StretchImage;

            BackgroundImage = Image.FromFile(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\DesktopReborn\\CurrentWallpaper.png");
            mainBackground.Image = BackgroundImage;
        }
        else
        {
            BackgroundImage = Image.FromFile(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\DesktopReborn\\DefaultWallpaper.jpg");
        }

我已经尝试了很多次,无法弄清楚如何设置PictureBox图像我做错了!

Image img;
            using (var bmpTemp = new Bitmap(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\DesktopReborn\\CurrentWallpaper.png"))
            {
                img = new Bitmap(bmpTemp);
                mainBackground.Image = img; //mainBackground is the picturebox
            }

1 个答案:

答案 0 :(得分:3)

Image.FromFile将尝试锁定文件,如documentation中所述:

“文件保持锁定状态,直到处理完图像为止。”

如果另一个进程已经将文件锁定,则Image.FromFile将抛出您所看到的IOException。相反,您应该使用的是位图,例如

Image img = null;
using (Bitmap bitmap = new Bitmap(fileName))
{
    img = new Bitmap(bitmap);
}

另请参阅:Open Image from file, then release lock?