删除 PictureBox 中的图像

Deleting Image that's in PictureBox

我已经搜索并阅读了很多不同的方法...并尝试了其中的许多方法。

当程序加载时,它会将 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);
    }

参见Image.FromFile()

The file remains locked until the Image is disposed.

为了解决这个问题,将返回的图像传递给一个新的位图,以便释放原来的锁:

        Image tmp = Image.FromFile(@"C:\pics\logo.png");
        Image CurrentWM = new Bitmap(tmp);
        tmp.Dispose();

正如 this question, an image created by Image.FromFile keeps the underlying file open. This is by design, as the MSDN documentation 的一些答案中所指出的那样 ("The file remains locked until the Image is disposed.")。您可以通过将文件加载到 MemoryStream,然后从该流创建图像来解决这个问题。

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;
}