我已经搜索并阅读了很多不同的方法来做到这一点......并尝试了很多方法。
当程序加载时,将printmark.png加载到图片框中 当然,每当我尝试删除PNG文件时,它都会说它正在使用中。如您所见,我已尝试过Image.FileFrom和picturebox.Load方法。
这是我的代码。
private void GetCurrentLogos()
{
Image CurrentWM = Image.FromFile(@"C:\pics\logo.png");
Image CurrentPM = Image.FromFile(@"C:\pics\printmark.png");
pbWatermark.Image = CurrentWM;
pbPrintmark.Image = CurrentPM;
//pbWatermark.Load(@"C:\pics\logo.png");
//pbPrintmark.Load(@"C:\pics\printmark.png");
}
private void btnSetPM_Click(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count > 0)
{
ListViewItem item = listView1.SelectedItems[0];
txtNewPM.Text = item.Tag.ToString();
pbPrintmark.Image.Dispose();
pbPrintmark.Image = null;
pbPrintmark.Refresh();
Application.DoEvents();
renameMark("printmark.png", txtNewPM.Text);
}
}
private void renameMark(string MarkType, string FileName)
{
string path = txtPath.Text;
string FullSource = path + FileName;
string FullDest = path + MarkType;
if(File.Exists(FullDest))
{
File.Delete(FullDest);
}
System.IO.File.Copy(FullSource, FullDest);
}
答案 0 :(得分:0)
请参阅Image.FromFile():
文件保持锁定状态,直到图像被丢弃。
要解决此问题,请将返回的图像传递给新的Bitmap,以便释放原始锁:
Image tmp = Image.FromFile(@"C:\pics\logo.png");
Image CurrentWM = new Bitmap(tmp);
tmp.Dispose();
答案 1 :(得分:0)
正如this question的一些答案中所述,Image.FromFile
创建的图像会保持基础文件处于打开状态。这是设计的,因为MSDN documentation说(“文件保持锁定,直到图像被丢弃。”)。您可以通过将文件加载到MemoryStream
,然后从该流创建图像来解决此问题。
答案 2 :(得分:0)
tmp.Dispose();没有为我工作所以也许你也需要一个不同的解决方案。
我将它用于我的dataGridView_SelectionChanged:
private void dataGridViewAnzeige_SelectionChanged(object sender, EventArgs e)
{
var imageAsByteArray = File.ReadAllBytes(path);
pictureBox1.Image = byteArrayToImage(imageAsByteArray);
}
public Image byteArrayToImage(byte[] byteArrayIn)
{
MemoryStream ms = new MemoryStream(byteArrayIn);
Image returnImage = Image.FromStream(ms);
return returnImage;
}