从流程表单PictureBox中释放图像

本文关键字:PictureBox 释放 图像 表单 程表单 | 更新日期: 2023-09-27 18:20:30

我遇到错误"System.IO.IOException:进程无法访问文件"I:''User''Image''BarCodes''QTY.png",因为另一个进程正在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 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);

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

我正在使用

PictureBox1.Image = null;

但没有运气

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

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

编辑(来自@HansPassant的帮助)更改了类中的InsertBardCode

public Image InsertBarCode(string barCodeString)
    {
        Bitmap barCodeImage = CreateBarCode("*" + barCodeString + "*");
        return barCodeImage;
    }

接缝工作得很好

从流程表单PictureBox中释放图像

请参阅接收文件路径的位图构造函数文档:

该文件将保持锁定状态,直到位图被释放为止。

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

一个修复方法是从第一个位图创建一个新位图,然后允许第一个位图处理:

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

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

加载图像的最佳方法是这样的

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

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