Ошибка при загрузке JPEG: «Произошла общая ошибка в GDI +». - PullRequest
1 голос
/ 17 июля 2009

У меня есть несколько файлов JPEG, которые я не могу загрузить в свое приложение C #. Они прекрасно загружаются в другие приложения, такие как GIMP. Это строка кода, которую я использую для загрузки изображения:

System.Drawing.Image img = System.Drawing.Image.FromFile(@"C:\Image.jpg");

Исключение, которое я получаю: «Произошла общая ошибка в GDI +.», Которая на самом деле не очень полезна. Кто-нибудь еще сталкивался с этим или знает способ обойти это?

Примечание. Если вы хотите проверить проблему, вы можете загрузить тестовое изображение , которое не работает в C #.

Ответы [ 5 ]

5 голосов
/ 06 августа 2010

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

Стандарт JPEG определяет формат метаданных, файл, который состоит из серии «кусков» данных (которые они называют «сегментами»). Каждый чанк начинается с маркера FF, за которым следует еще один байт маркера, чтобы определить тип чанка, а затем пара байтов, которые описывают длину чанка (16-разрядное значение с прямым порядком байтов). Некоторые куски (например, FFD8, «Начало изображения») имеют решающее значение для использования файла, а некоторые (например, FFFE, «Комментарий») совершенно бессмысленны.

Когда был определен стандарт JPEG, они также включали так называемые «маркеры APP» - типы от FFE0 до FFEF - которые должны были использоваться для «данных для конкретного приложения». Эти программы по-разному используются различными программами, но по большей части они бессмысленны и могут быть безопасно проигнорированы, за исключением APP0 (FFE0), который используется для данных JFIF: JFIF немного расширяет стандарт JPEG для включите дополнительную полезную информацию, такую ​​как DPI изображения.

Проблема с вашим изображением заключается в том, что оно содержит маркер FFE1, а за ним стоит блок нулевого размера. В остальном это ничем не примечательные данные изображения (замечательное изображение, но ничем не примечательные данные), за исключением этого странного маленького бесполезного блока APP1. GDI + ошибочно пытается интерпретировать этот фрагмент APP1, вероятно, пытается декодировать его как данные EXIF, и он взрывается. (Я предполагаю, что GDI + умирает, потому что он пытается обработать массив нулевого размера.) GDI +, если он был написан правильно, проигнорирует любые фрагменты APPn, которые он не понимает, но вместо этого он пытается найти смысл данные, которые по определению нестандартны и вспыхивают.

Таким образом, решение состоит в том, чтобы написать небольшую подпрограмму, которая будет считывать ваш файл в память, вырезать ненужные фрагменты APPn (маркеры с FFE1 по FFEF) и затем передавать полученные «чистые» данные изображения в GDI +, который затем обрабатывать правильно.

В настоящее время у нас здесь проходит конкурс, чтобы выяснить, кто может написать процедуру очистки JPEG быстрее всего с забавными призами: -)


Для скептиков: Это изображение не"слегка нестандартное". Образ использует APP1 для своих собственных целей, и GDI + очень неправильно пытается обрабатывать эти данные. Другие приложения без проблем читают образ, потому что они по праву игнорируют фрагменты приложения, как они должны.

1 голос
/ 17 июля 2009

.Net не обрабатывает формат этого конкретного изображения, возможно, из-за того, что формат данных jpeg немного некачественный или нестандартный. Если вы загрузите изображение в GIMP и сохраните его в новом файле, вы сможете загрузить его с классом Image. Предположительно, GIMP немного прощает проблемы с форматом файлов.

0 голосов
/ 12 ноября 2010

У меня такая же проблема.

Единственное отличие, которое я заметил, это сжатие. Он отлично работает с «JPEG», но когда сжатие равно «Progressive JPEG», я получаю исключение (в GDI + произошла общая ошибка).

Сначала я подумал, что это может быть проблема с памятью, потому что упомянутые мною изображения были довольно большими (около 5 МБ на диске и, возможно, ~ 80 МБ в памяти), но потом я заметил разницу в типе сжатия. *

Когда я открываю / сохраняю файл изображения в другой программе, такой как IrfanView или GIMP, результат в порядке, но это не идея.

0 голосов
/ 17 июля 2009

Ошибка может быть проблема с разрешением. Особенно, если ваше приложение является приложением ASP.NET. Попробуйте переместить файл в тот же каталог, где находится исполняемый файл (если Win создается) или в корневой каталог веб-приложения (если asp.net).

0 голосов
/ 17 июля 2009

Эта тема с форумов MSDN может быть полезна.

Ошибка может означать, что данные повреждены или есть какой-то основной поток это было слишком рано.

...