从过程窗体 PictureBox 中释放图像

Release image from process form PictureBox

我遇到错误 "System.IO.IOException: The process cannot access the file 'I:\User\Image\BarCodes\QTY.png' because it is being used by another process.at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)"

我知道这个错误是因为同一程序的其他一些程序正在使用该进程,或者至少我是这么认为的。

这是导致此错误的按钮

private void createbtn_Click(object sender, EventArgs e)
    {
        InsertBarCodeImage();

    }

private void InsertBarCodeImage()
    {
        try
        {
            if (qtytxt.Text !=  String.Empty)
            {
                Picturebox1.Image = null;

                BarCode insertBarCode = new BarCode();

                insertBarCode.InsertBarCode(qtytxt.Text, Picturebox1.Image);

                Picturebox1.Image = new Bitmap(insertBarCode.BARCODEQUANTITYNAMERUTE);

                Picturebox1.SizeMode = PictureBoxSizeMode.StretchImage;

                MessageBox.Show("Label created");

            }
            else
            {
                MessageBox.Show("Please enter qty", "Verify", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString());
        }
    }

Class

class BarCode
{
    public string BARCODEQUANTITYNAMERUTE { get; set; }

    public void InsertBarCode(string quantity, Image quantityImage)
    {

        BARCODEQUANTITYNAMERUTE = @"I:\User\Image\BarCodes\QTY.png";

        try
        {

            Bitmap quantityBarCode = CreateBarCode("*" + quantity + "*");

            if (System.IO.File.Exists(BARCODEQUANTITYNAMERUTE))
                System.IO.File.Delete(BARCODEQUANTITYNAMERUTE);

            quantityBarCode.Save(BARCODEQUANTITYNAMERUTE, System.Drawing.Imaging.ImageFormat.Png);
            quantityImage = new Bitmap(BARCODEQUANTITYNAMERUTE);

        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

    private Bitmap CreateBarCode(string text)
    {
        Bitmap barcode = new Bitmap(1, 1);
        const string freeThreeOfNine = "Free 3 of 9";
        Font fontthreeofnine = new Font(freeThreeOfNine, 40, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
        Graphics graphics = Graphics.FromImage(barcode);

        SizeF datasize = graphics.MeasureString(text, fontthreeofnine);

        barcode = new Bitmap(barcode, datasize.ToSize());

        graphics = Graphics.FromImage(barcode);

        graphics.Clear(Color.White);

        graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;

        graphics.DrawString(text, fontthreeofnine, new SolidBrush(Color.Black), 0, 0);

        graphics.Flush();

        fontthreeofnine.Dispose();
        graphics.Dispose();

        return barcode;
    }
}

所以错误发生在点击事件第二次发生时,在线

if (System.IO.File.Exists(BARCODEQUANTITYNAMERUTE))
            System.IO.File.Delete(BARCODEQUANTITYNAMERUTE);

它试图删除第一个单击事件的上一个图像,我如何才能停止该过程以便它能够删除图像并使用当前文本值重新创建它并将其显示在 PictureBox 上???

我正在使用

PictureBox1.Image = null;

但运气不好

如有任何帮助,我将不胜感激。

此外,如果您能在评论中指出任何好的做法,那将对我有所帮助。

编辑(来自@HansPassant 的帮助)更改了 Class

中的 InsertBardCode
public Image InsertBarCode(string barCodeString)
    {
        Bitmap barCodeImage = CreateBarCode("*" + barCodeString + "*");

        return barCodeImage;
    }

接缝效果很好

查看接收文件路径Bitmap Constructor Documentation

The file remains locked until the Bitmap is disposed.

由于位图正在 PictureBox 中使用,因此尚未处理,因此文件仍处于锁定状态,导致您出现异常。

一个解决方法是从第一个创建一个新的位图,然后让第一个处理:

using (var img = new Bitmap(insertBarCode.BARCODEQUANTITYNAMERUTE))
{
    Picturebox1.Image = new Bitmap(img);
}

按照Idle_Mind的建议,而不是 Picturebox1.Image = 空; 你可以使用 Picturebox1.Image.处置();

最好的加载图片的方法是这样的

Image tempImage = Image.FromFile("image.jpg");
Bitmap tempBitmap = new Bitmap(tempImage);
pictureBox.Image = tempBitmap;

答案的原始来源在这里https://www.codeproject.com/Questions/492654/bc-dplusdeleteplusimagepluswhichplusisplusope