从流程表单PictureBox

时间:2015-11-04 00:17:20

标签: c# visual-studio file-io picturebox

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

接缝工作得很好

3 个答案:

答案 0 :(得分:2)

请参阅接收文件路径的Bitmap Constructor Documentation

  

文件保持锁定状态,直到丢弃位图。

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

一个解决方法是从第一个创建一个新的Bitmap,然后允许第一个配置:

ave

答案 1 :(得分:1)

加载图像而不保留图像的最佳方法就是这样

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

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

答案 2 :(得分:0)

正如Idle_Mind建议的那样,而不是     Picturebox1.Image = null; 你可以用     Picturebox1.Image.Dispose();