Исправлена ​​ошибка «Произошла общая ошибка в GDI +» при создании штрих-кода. - PullRequest
8 голосов
/ 22 июля 2010

Я пишу генератор штрих-кода на 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 ]

5 голосов
/ 24 декабря 2014

Примечание: заголовок вводит в заблуждение, поскольку не описывается никаких проблем, связанных с созданием штрих-кодов, а речь идет о сохранении изображений / растровых изображений. Я могу только предположить, что г-н 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.

Выход:

enter image description hereenter image description here

Первое и последнее изображения не сохраняются по причинам, описанным выше и в комментариях к коду.

1 голос
/ 25 декабря 2014

У меня была эта проблема раньше, и я смог решить ее, используя промежуточный растровый объект, что-то вроде этого:

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");

Я нашел это решение / обходной путь здесь

Причина в том, что «вы пытаетесь записать в файл, в котором уже открыто растровое изображение», как упоминалось ранее в @Plutonix.

0 голосов
/ 22 июля 2010

ваша проблема с разрешениями.разрешите сетевой службе полный доступ к пути, по которому вы сохраняете файл, и посмотрите, поможет ли это

удачи!

0 голосов
/ 18 октября 2011

Вы также можете попробовать Aspose.BarCode для .NET .Этот компонент позволяет создавать штрих-коды с нуля и работать с существующими штрих-кодами.Это обеспечивает большую гибкость для создания различных изображений штрих-кода.Вы можете использовать его с любым типом приложения .NET.Пожалуйста, попробуйте в конце и посмотрите, может ли это помочь в вашем сценарии.

Раскрытие информации: я работаю евангелистом разработчика в Aspose.

0 голосов
/ 22 июля 2010

Gif - это индексированный формат поддонов.

Сохраните его в совместимом формате, который использовался для создания экземпляра Bitmap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...