我正在开发一个程序,您可以在其中更改主窗体“ 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
}
答案 0 :(得分:3)
Image.FromFile将尝试锁定文件,如documentation中所述:
“文件保持锁定状态,直到处理完图像为止。”
如果另一个进程已经将文件锁定,则Image.FromFile将抛出您所看到的IOException。相反,您应该使用的是位图,例如
Image img = null;
using (Bitmap bitmap = new Bitmap(fileName))
{
img = new Bitmap(bitmap);
}