C# “固定”;GDI+;中发生一般错误&引用;在生成条形码时
我正在用C#编写一个条形码生成器,我可以将条形码生成为位图,并可以在Picturebox(WindowsForms)中显示它们。另一方面,我无法将条形码保存为gif或jpeg文件。我的条形码是一个位图文件,这是我的代码C# “固定”;GDI+;中发生一般错误&引用;在生成条形码时,c#,.net,winforms,image,barcode,C#,.net,Winforms,Image,Barcode,我正在用C#编写一个条形码生成器,我可以将条形码生成为位图,并可以在Picturebox(WindowsForms)中显示它们。另一方面,我无法将条形码保存为gif或jpeg文件。我的条形码是一个位图文件,这是我的代码 Bitmap barCode = CreateBarCode("*"+txtBarCodeStr.Text+"*"); barCode.Save(@"C:\barcode.gif", ImageFormat.gif); picBox.Image = barCode;
Bitmap barCode = CreateBarCode("*"+txtBarCodeStr.Text+"*");
barCode.Save(@"C:\barcode.gif", ImageFormat.gif);
picBox.Image = barCode;
MessageBox.Show("Created");
我得到以下例外;
GDI+中出现一般错误。Gif是索引托盘格式
将其保存为用于创建
位图
实例的兼容格式。您的问题是权限。允许网络服务完全访问您正在保存文件的路径,并查看这是否有帮助
祝你好运 你也可以试试。此组件允许您使用现有条形码进行编辑和操作。它为创建各种条形码图像提供了极大的灵活性。您可以将其用于任何类型的.NET应用程序。请在您这边试试,看看这是否对您的场景有帮助
披露:我在Aspose担任开发人员宣传员。注意:标题具有误导性,因为没有描述与创建条形码相关的问题,而是关于保存图像/位图。我只能假设普希耶达斯先生,赏金提供者,也有同样的错误,因为没有提供进一步的信息
GDI+问题中出现的
一般错误通常意味着两件事之一:
A)您正试图写入已打开位图图像的文件。来自:
不允许将图像保存到构造它的源文件中,并引发异常
因此,如果你在应用程序的其他地方有一个位图,它是由一个文件创建的,那么在位图被释放之前,你不能保存回同一个文件。显而易见的解决方案是创建一个新位图并保存它
B)您可能无法访问该文件夹/文件
这是更可能出现的问题,因为根据操作系统、安全设置、权限等,可能不允许对启动驱动器根文件夹中的文件执行文件IO(如OP的示例代码所示)
在下面的代码中,如果我尝试保存到“C:\ziggybarcode.gif”
而不是\Temp
文件夹,则不会发生任何事情。没有例外,但也没有创建图像。在不同的情况下,可能会产生异常,但通常这些情况似乎被报告为一般错误解决方案:不要将根文件夹用于文件Users\USERNAME\…
就是为了这个目的
C)文件夹/文件名可能不合法
如果文件名是由代码设计的,则可能是文件或路径非法。使用文本合法路径,如@“C:\Temp\mybarcode.gif”
(对于VB,请忽略@
)
使用Path.Combine()
构建合法路径;并确保文件名不包含非法字符
有时会出现的另一个异常,可能会引起人们的兴趣,就是内存不足异常。这通常意味着图像格式有问题。我有几个应用程序在图像上做了大量工作,发现跟踪图像格式或假设图像可以在任何给定的机器上保存为特定格式都有问题。条形码生成器可能存在类似问题
对于简单的应用程序或只处理单一标准格式的应用程序,简单的位图.Save
方法通常可以:
myBmp.Save(@"C:\Temp\mybarcode.gif", ImageFormat.Gif);
但是,当你的应用程序处理不同的格式时,最好对图像进行显式编码:
public static bool SaveImageFile(string fileName, ImageFormat format, Image img,
Int64 quality)
{
ImageCodecInfo codec = GetEncoder(format);
EncoderParameter qParam = new EncoderParameter(Encoder.Quality, quality);
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = qParam;
try
{
img.Save(fileName, codec, encoderParams);
return true;
}
catch
{
return false;
}
}
private static ImageCodecInfo GetEncoder(ImageFormat format)
{
var codecs = ImageCodecInfo.GetImageDecoders();
foreach (var codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}
将它们放在DLL中或使其成为扩展,使用它们变得同样简单:
SaveImageFile(@"c:\Temp\myBarCode.gif",
ImageFormat.Gif, myBmp, 100);
特别是在使用JPGs时,管理压缩/质量参数变得特别容易。我并不是说这是首选方法,只是说通过显式编码图像,我在复杂应用程序中遇到的问题要少得多
测试代码创建条形码GIF:
private void button1_Click(object sender, EventArgs e)
{
Bitmap bmp = CreateBarcode("Ziggy12345");
this.pb.Image = bmp;
try {
// save to root of boot drive
// does nothing on my system: no Error, No File
bmp.Save(@"C:\zBarCodeDIRECT.gif", ImageFormat.Gif);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
// save BMP to file
SaveImageFile(@"c:\Temp\zBarCodeBITMAP.gif",
ImageFormat.Gif, bmp, 100);
// save PicBox image
SaveImageFile(@"c:\Temp\zBarCodePICBOX.gif",
ImageFormat.Gif, this.pb.Image, 100);
// Try to save to same file while a bmp is open on it
Bitmap myBmp = (Bitmap)Image.FromFile(@"c:\Temp\zBarCodeBITMAP.gif");
// A generic Error in GDI
myBmp.Save(@"c:\Temp\zBarCodeBITMAP.gif", ImageFormat.Gif);
}
最后一个失败,出现通用GDI错误
,尽管它似乎应该是IO或未经授权的访问相关异常
输出:
由于上述原因和代码注释中的原因,第一个和最后一个图像无法保存。我以前遇到过这个问题,我可以使用中间位图对象解决它,类似这样:
Bitmap barCode = CreateBarCode("*"+txtBarCodeStr.Text+"*");
//Use an intermediate bitmap object
Bitmap bm = new Bitmap(barCode);
bm.Save(@"C:\barcode.gif", ImageFormat.gif);
picBox.Image = barCode;
MessageBox.Show("Created");
我找到了这个解决方案/解决方法
原因是“您正试图写入一个已打开位图图像的文件”,正如前面提到的@puropoix。我找到了一个简单的解决方案:
在解决方案中创建文件夹,例如,我在解决方案中创建了模板文件夹(在项目内部)
然后尝试使用Server.MapPath将文件保存到该文件夹中,例如,Bitmap.save(HttpContext.Current.Server.MapPath(“/Template/3777.jpeg”)、System.Drawing.Imaging.ImageFormat.jpeg)代码>
最后返回HttpContext.Current.Server.MapPath(“/Template/3777.jpeg”)代码>
对我来说,它工作得很好,这种方法的优点是您要保存的文件,而不是保存到文件夹中,但当您返回时,它会获取文件
您能否提供引发异常的更多信息(第1行或第2行)?可能提供Stacktrace。我已将其重新标记为winforms(broaer,您将其标记为ASP.NET)。您无法将文件写入C:\目录,UAC会阻止此操作。使用Environment.GetFolderPath()选择适当的文件夹。