Примечание: заголовок вводит в заблуждение, поскольку не описывается никаких проблем, связанных с созданием штрих-кодов, а речь идет о сохранении изображений / растровых изображений. Я могу только предположить, что г-н Puthiyedath, поставщик вознаграждений, имеет ту же ошибку, поскольку никакой дополнительной информации не предоставлено.
Проблема generic error occurred in GDI+
обычно означает одну из двух вещей:
A) Вы пытаетесь записать файл, в котором уже открыто растровое изображение. От MSDN :
Сохранение изображения в том же файле, из которого оно было построено, не допускается и выдает исключение.
Таким образом, если в приложении в другом месте есть растровое изображение, созданное из файла, вы не сможете сохранить его в тот же файл, пока оно не будет удалено. Очевидное решение - создать новое растровое изображение и сохранить его.
B) Возможно, у вас нет доступа к папке / файлу
Это более вероятная проблема , поскольку выполнение File IO для файла в корневой папке загрузочного диска (как в примере кода с помощью OP) может быть запрещено в зависимости от ОС, безопасности настройки, разрешения и т. д. и т. д.
В приведенном ниже коде, если я попытаюсь сохранить в "C:\ziggybarcode.gif"
вместо папки \Temp
, ничего не произойдет . Нет никаких исключений, но изображение также не создается. При других условиях может возникнуть исключение, но часто они, как представляется, сообщаются как общая ошибка. Решение: Не используйте корневую папку для файлов. Users\USERNAME\...
предназначен именно для этой цели.
C) Имя папки / файла может быть недопустимым
Если имя файла придумано в коде, возможно, файл или путь недопустимы. Проверьте это, используя буквальный, допустимый путь, такой как @"C:\Temp\mybarcode.gif"
(пропустите @
для VB).
Используйте Path.Combine()
для построения легального пути; и убедитесь, что имя файла не содержит недопустимых символов.
Еще одно исключение, которое иногда возникает и может представлять интерес, - это Исключение нехватки памяти . Обычно это означает, что есть проблема с форматом изображения. У меня есть пара приложений, которые много работают с изображениями, и обнаружил, что было проблематично отслеживать формат или , предполагая , что изображение может быть сохранено в определенном формате на любом компьютере, У генератора 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 было гораздо меньше проблем в сложных приложениях при явном кодировании изображений.
Тестовый код для создания GIF-кода BarCode:
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.
Выход:
Первое и последнее изображения не сохраняются по причинам, описанным выше и в комментариях к коду.