使用外部编辑器编辑图片框图像并加载新图像
Editting the picturebox image using external editor and loading the new image
我尝试在运行时打开外部编辑器并编辑当前设置为 PictureBox
的图像,编辑图像并在关闭编辑器后更新图像。
为此,我有一个简单的 c# windows 应用程序,其中有一个 PictureBox
两个 Button
一个用于从文件加载 PictureBox
图像,另一个用于使用 MS Paint
编辑图像.
这是代码:
public partial class Form1 : Form
{
string myImagePath = @"C:\temp\bt_logo.png";
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
pictureBox1.Image = Image.FromFile(myImagePath);
}
private void button2_Click(object sender, EventArgs e)
{
System.Diagnostics.ProcessStartInfo launchEditor = new System.Diagnostics.ProcessStartInfo();
launchEditor.FileName = "mspaint";
launchEditor.Arguments = myImagePath;
launchEditor.UseShellExecute = true;
System.Diagnostics.Process.Start(launchEditor);
}
}
编辑器已成功打开,但由于访问问题无法保存更改:
知道如何解决这个问题吗?
编辑1:
为了在编辑器打开时停止访问图片,我修改了button2_Click()
的代码如下:
pictureBox1.Image = null;
System.Diagnostics.ProcessStartInfo launchEditor = new System.Diagnostics.ProcessStartInfo();
launchEditor.FileName = "mspaint";
launchEditor.Arguments = myImagePath;
launchEditor.UseShellExecute = true;
System.Diagnostics.Process.Start(launchEditor);
pictureBox1.Image = Image.FromFile(myImagePath);
同样的结果。作为另一种尝试,我复制了图像,修改了它并将其复制到原始图像,
System.IO.File.Copy(myImagePath, myImagePath_temp, true);
System.Diagnostics.ProcessStartInfo launchEditor = new System.Diagnostics.ProcessStartInfo();
launchEditor.FileName = "mspaint";
launchEditor.Arguments = myImagePath_temp;
launchEditor.UseShellExecute = true;
System.Diagnostics.Process.Start(launchEditor);
System.IO.File.Copy(myImagePath_temp, myImagePath, true);
同样的结果!
这个问题本质上是
的重复
Open Image from file, then release lock?
Image.FromFile 锁定磁盘上的文件,直到代码中的图像变量被处理掉。您应该观察上面那个问题的公认答案;它提供了一种从磁盘加载图像数据,将其复制到程序内存中,然后释放文件锁定并在图片框中使用位图数据副本的方法
您将找到有关如何在不将图像锁定在文件系统中的情况下加载图像的答案。我正在写一个答案而不是评论,因为我想为程序的其余部分提供一些进一步的建议
看看 FileSystemWatcher class; Notification when a file changes?
您可以使用它来检测文件的更改,这样图片框就可以在文件保存时更新,而不是在绘画退出时更新 - 这比编写代码来检测应用程序关闭更容易
我尝试在运行时打开外部编辑器并编辑当前设置为 PictureBox
的图像,编辑图像并在关闭编辑器后更新图像。
为此,我有一个简单的 c# windows 应用程序,其中有一个 PictureBox
两个 Button
一个用于从文件加载 PictureBox
图像,另一个用于使用 MS Paint
编辑图像.
这是代码:
public partial class Form1 : Form
{
string myImagePath = @"C:\temp\bt_logo.png";
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
pictureBox1.Image = Image.FromFile(myImagePath);
}
private void button2_Click(object sender, EventArgs e)
{
System.Diagnostics.ProcessStartInfo launchEditor = new System.Diagnostics.ProcessStartInfo();
launchEditor.FileName = "mspaint";
launchEditor.Arguments = myImagePath;
launchEditor.UseShellExecute = true;
System.Diagnostics.Process.Start(launchEditor);
}
}
编辑器已成功打开,但由于访问问题无法保存更改:
知道如何解决这个问题吗?
编辑1:
为了在编辑器打开时停止访问图片,我修改了button2_Click()
的代码如下:
pictureBox1.Image = null;
System.Diagnostics.ProcessStartInfo launchEditor = new System.Diagnostics.ProcessStartInfo();
launchEditor.FileName = "mspaint";
launchEditor.Arguments = myImagePath;
launchEditor.UseShellExecute = true;
System.Diagnostics.Process.Start(launchEditor);
pictureBox1.Image = Image.FromFile(myImagePath);
同样的结果。作为另一种尝试,我复制了图像,修改了它并将其复制到原始图像,
System.IO.File.Copy(myImagePath, myImagePath_temp, true);
System.Diagnostics.ProcessStartInfo launchEditor = new System.Diagnostics.ProcessStartInfo();
launchEditor.FileName = "mspaint";
launchEditor.Arguments = myImagePath_temp;
launchEditor.UseShellExecute = true;
System.Diagnostics.Process.Start(launchEditor);
System.IO.File.Copy(myImagePath_temp, myImagePath, true);
同样的结果!
这个问题本质上是
的重复Open Image from file, then release lock?
Image.FromFile 锁定磁盘上的文件,直到代码中的图像变量被处理掉。您应该观察上面那个问题的公认答案;它提供了一种从磁盘加载图像数据,将其复制到程序内存中,然后释放文件锁定并在图片框中使用位图数据副本的方法
您将找到有关如何在不将图像锁定在文件系统中的情况下加载图像的答案。我正在写一个答案而不是评论,因为我想为程序的其余部分提供一些进一步的建议
看看 FileSystemWatcher class; Notification when a file changes?
您可以使用它来检测文件的更改,这样图片框就可以在文件保存时更新,而不是在绘画退出时更新 - 这比编写代码来检测应用程序关闭更容易