- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在用 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 相关的异常。
输出:
由于上述和代码注释中解释的原因,第一张和最后一张图片未保存。
关于c# - 生成条码时修复 "Generic error occurred in GDI+",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3308234/
这两个库之间有什么区别吗? 最佳答案 根据the wikipedia article on GDI : With the introduction of Windows XP, GDI was dep
我喜欢 GDI+,因为它具有高性能并且包含在 Windows XP 中。但是,它的模糊类和效果类仅在 GDI+ 1.1 中可用,后者仅随 Windows Vista 或更高版本提供。尽管微软计划很快放
我用 C# 创建了一个图像服务,它采用基础层图像 (JPG),再分层一层更透明的 PNG(32 位),然后输出最终的 JPG 图像。我试图从这个函数中挤出最后一毫秒,但我的代码在 GDI+ 中的 Dr
我正在使用顶点以及 LineTo() 和 MoveTo() 函数制作一系列三角形来表示 3D 形状。 着色/填充这些三角形的最佳方法是什么? 谢谢 最佳答案 MSDN has a sample tha
我在 Win7 系统上注意到过一个问题,以为是 DWM 错误,但在重新启动后已修复。但现在我意识到它在其他人的系统上发生(作为默认行为),并且这也是 Surface Pro 上的正常行为。 如何重现问
是否可以在用户模式下创建自定义 GDI 设备?我们的想法是创建一个设备上下文 (HDC),我们可以将其传递给不透明的组件,这样当组件调用 GDI 函数(如 TextOut)时,我们可以获得实际的文本字
我想知道是否可以枚举所有桌面可见窗口以创建它们的位图并将所有位图组合成一个以便获得桌面的完整屏幕截图? 最有可能使用 GDI/GD+,但也欢迎使用任何外部库。首选语言C\C++。 提前致谢。 最佳答案
我有一个生成元文件 (EMF) 的应用程序。它使用引用设备(又名屏幕)来呈现这些元文件,因此元文件的 DPI 会根据代码运行的机器而变化。 假设我的代码打算创建一个 8.5 x 11 英寸的元文件。
我在同时使用 GDI 和 GDI+ 进行绘图时遇到问题。页面转换——尤其是缩放——似乎在两者之间有点偏离。除了 SetViewportExt 和 SetWindowExt 之外,GDI 上下文的哪些属
我需要从应用程序中获取一个大表(300K+ 行)并且没有导出功能。经过多次不成功的尝试后,我只剩下一个复制粘贴宏,一次一行。如果有办法在绘制时获取字符串,我可以一次获取一页(40 行)。 最佳答案 如
我曾经在我的 Win7 系统上注意到一个问题,认为这是一个 DWM 错误,因为它在重新启动后得到修复。但现在我意识到它正在其他人的系统上发生(作为默认行为),这也是 Surface Pro 上的正常行
我正在寻找一些高级教程,或者可能是用 C++ 或 .NET 编写的开源应用程序,它们可以实现复杂的基于 vector 的应用程序,例如 MS Visio 或 Autocad。我需要知道的是,当用户可以
我正在使用第三方库来绘制图表。该库需要一个 HDC (GDI)。但是我的应用程序使用的是 GDI+。 Q1:这样做安全吗? void f(Gdiplus::Graphics& graphics) {
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 4年前关闭。 Improve t
对不起,如果这是题外话。如果是这样的话;请随时将其移至适当的站点。 GDI/GDI+ 如何在不使用 DirectX 或 OpenGL 等较低级别的 API 与 GPU 通信的情况下渲染到显卡(在屏幕上
我正在尝试在兼容的渲染目标上使用 Gdi 和 Direct 2D 来渲染位图。我使用 D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_GDI_COMPATIBLE 选项创建
我们目前正在将一个较旧的应用程序转换为通过 GDI+ 绘制,而不是直接使用 GDI。随着我们逐步翻译系统,有时我们需要从 Gdiplus::Graphics 对象中获取 HDC,以便允许尚未翻译的代码
我正在尝试使用 GDI+ 在屏幕上(整个屏幕,在所有其他窗口的顶部)绘图。 我已将 NULL 传递给 GetDC 以将 HDC 显示到屏幕上,然后使用它创建一个 Graphics 对象,并使用 Dra
GDI+ 非常慢,几乎完全是软件,而 GDI 是高度硬件加速的。GDI+ 是 Graphics 类在 WinForms 上使用的东西,它太慢了。 有没有人制作了 .NET GDI 库以便我们可以有速度
ASP.NET 网站随机引发此 System.Drawing-error: System.Runtime.InteropServices.ExternalException:System.Drawin
我是一名优秀的程序员,十分优秀!