我正在用C#编写条形码生成器我可以生成条形码作为位图,并可以在Picturebox(WindowsForms)中显示它们。另一方面,我无法将条形码保存为gif或jpeg文件。我的条形码是位图文件,这是我的代码
Bitmap barCode = CreateBarCode("*"+txtBarCodeStr.Text+"*");
barCode.Save(@"C:\barcode.gif", ImageFormat.gif);
picBox.Image = barCode;
MessageBox.Show("Created");
我得到以下异常; GDI +中发生了一般错误。
答案 0 :(得分:5)
注意:标题具有误导性,因为没有描述与创建条形码有关的问题,而是关于保存图像/位图。我只能假设赏金提供者Puthiyedath先生有同样的错误,因为没有提供进一步的信息。
generic error occurred in GDI+
问题通常意味着两件事之一:
A)您正在尝试写入已打开位图图像的文件。来自MSDN:
不允许将图像保存到构造它的同一文件中并引发异常。
因此,如果在从文件创建的应用程序的其他位置有位图,则在放置位图之前无法保存回同一文件。显而易见的解决方案是创建一个新的位图并保存它。
B)您可能无权访问文件夹/文件
这是更可能的问题,因为根据操作系统的不同,可能会禁止将文件IO执行到启动驱动器的根文件夹中的文件(如OP的示例代码中所示),安全设置,权限等等。
在下面的代码中,如果我尝试保存到"C:\ziggybarcode.gif"
而不是\Temp
文件夹,就不会发生。没有例外,但也没有创建图像。在不同的条件下可能会导致异常,但通常会将这些异常报告为通用错误。 解决方案:不要将根文件夹用于文件。 Users\USERNAME\...
仅用于此目的。
C)文件夹/文件名可能不合法
如果文件名是在代码中设计的,则可能是文件或路径是非法的。使用文字的合法路径(例如@"C:\Temp\mybarcode.gif"
进行测试(省略VB的@
)。
使用Path.Combine()
构建合法路径;并确保文件名不包含非法字符。
有时出现的另一个例外可能是 Out of Memory Exception 。这通常意味着图像格式存在问题。我有几个应用程序在图像上做了很多工作,发现跟踪格式有问题,或者假设可以将图像保存到任何给定计算机上的特定格式 。 BarCode生成器可能有类似的问题。
对于简单的应用或只处理单一标准格式的应用,简单的Bitmap.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);
特别是在使用JPG时,管理压缩/质量参数变得特别容易。我并不是说这是首选方法,只是 I 通过显式编码图像在复杂应用程序中遇到的问题要少得多。
测试代码以创建BarCode 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);
}
最后一个失败了Generic GDI error
,即使它似乎它应该是IO或UnAuthorizedAccess相关的异常。
输出:
由于上述原因和代码注释中的原因,第一张和最后一张图片无法保存。
答案 1 :(得分:1)
之前我遇到过这个问题,我能够使用中间位图对象解决它,如下所示:
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");
我找到了此解决方案/解决方法here
原因是"您正在尝试写入已打开位图图像的文件"正如@Plutonix之前提到的那样。
答案 2 :(得分:0)
Gif是一种索引的托盘格式。
将其保存为用于创建Bitmap
实例的兼容格式。
答案 3 :(得分:0)
你的问题是权限。允许网络服务完全访问您保存文件的路径,看看是否有帮助
祝你好运!答案 4 :(得分:0)
您也可以尝试Aspose.BarCode for .NET。此组件允许您create bar codes from scratch并使用现有条形码。它为创建各种条形码图像提供了极大的灵活性。您可以将它与任何类型的.NET应用程序一起使用。请尝试一下,看看这对您的方案是否有帮助。
披露:我在Aspose担任开发人员传播者。