从流程表单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中使用,因此它尚未被处理,因此该文件仍处于锁定状态,导致出现异常。
一个修复方法是从第一个位图创建一个新位图,然后允许第一个位图处理:
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