Есть точный ответ на эту проблему. Сегодня мы столкнулись с этим на работе, и я смог окончательно доказать, что здесь происходит.
Стандарт 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 + очень неправильно пытается обрабатывать эти данные. Другие приложения без проблем читают образ, потому что они по праву игнорируют фрагменты приложения, как они должны.