在生成条形码时修复“GDI +中发生了一般错误”

时间:2010-07-22 11:18:50

标签: 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;            
MessageBox.Show("Created");

我得到以下异常; GDI +中发生了一般错误。

5 个答案:

答案 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相关的异常。

输出:

enter image description here enter image description here

由于上述原因和代码注释中的原因,第一张和最后一张图片无法保存。

答案 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担任开发人员传播者。