gpt4 book ai didi

c# - 生成条码时修复 "Generic error occurred in GDI+"

转载 作者:太空狗 更新时间:2023-10-29 19:40:08 24 4
gpt4 key购买 nike

我正在用 C# 编写条码生成器,我可以将条码生成为位图,并可以在图片框 (WindowsForms) 中显示它们。另一方面,我无法将条形码保存为 gif 或 jpeg 文件。我的条形码是一个位图文件,这是我的代码

Bitmap barCode = CreateBarCode("*"+txtBarCodeStr.Text+"*");
barCode.Save(@"C:\barcode.gif", ImageFormat.gif);
picBox.Image = barCode;
MessageBox.Show("Created");

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

最佳答案

注意:标题具有误导性,因为没有描述与创建条码相关的问题,而是关于保存图像/位图的问题。我只能假设赏金提供者 Puthiyedath 先生犯了同样的错误,因为没有提供进一步的信息。


generic error occurred in GDI+ 问题通常意味着以下两种情况之一:
A) 您正在尝试写入一个已经打开了位图图像的文件。 来自 MSDN :

Saving the image to the same file it was constructed from is not allowed and throws an exception.

因此,如果您在应用程序的其他地方有从文件创建的位图,则在处理该位图之前,您无法保存回同一个文件。显而易见的解决方案是创建一个新的位图并保存它。

B) 您可能无权访问该文件夹/文件

这是更有可能的问题,因为根据操作系统的不同,可能不允许对引导驱动器根文件夹中的文件执行文件 IO(如 OP 的示例代码中所示),安全设置、权限等等等等。

在下面的代码中,如果我尝试保存到 "C:\ziggybarcode.gif" 而不是 \Temp 文件夹,没有任何反应。也不异常(exception),但也没有创建图像。在不同的条件下,可能会导致异常,但通常这些似乎被报告为一般错误。 解决方案: 不要使用文件的根文件夹。 Users\USERNAME\... 就是为了这个目的。

C) 文件夹/文件名可能不合法

如果文件名是在代码中人为设计的,则可能是文件或路径不合法。使用诸如 @"C:\Temp\mybarcode.gif"(对于 VB 省略 @)这样的文字、合法路径进行测试。

使用Path.Combine()构造合法路径;并确保文件名不包含非法字符。


另一个有时会出现并且可能会引起兴趣的异常是内存不足异常。这通常意味着图像格式有问题。我有几个应用程序在图像上做了很多工作,但发现跟踪格式或假设可以将图像保存为特定格式在任何给定机器上是有问题的em>。条码生成器可能有类似的问题。

对于简单的应用程序或只处理单一标准格式的应用程序,简单的 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 时,管理压缩/质量参数变得特别容易。我并不是说这是首选方法,只是通过显式编码图像在复杂应用程序中遇到的问题要少得多。

测试代码以创建条形码 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 错误 而失败,尽管它看起来应该是一个 IO 或 UnAuthorizedAccess 相关的异常。

输出:

enter image description here enter image description here

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

关于c# - 生成条码时修复 "Generic error occurred in GDI+",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3308234/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com