删除PictureBox中的图像

时间:2015-01-09 02:47:45

标签: c# 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);
    }

3 个答案:

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