Обработка поврежденных JPEG-файлов в C # - PullRequest
0 голосов
/ 19 марта 2010

У нас есть процесс, который извлекает изображения с удаленного сервера. В большинстве случаев мы готовы к работе, изображения действительны, время ожидания не истекло и т. Д. Однако, каждый раз и некоторое время мы видим эту ошибку, похожую на эту:

Unhandled Exception: System.Runtime.InteropServices.ExternalException: A generic
 error occurred in GDI+.
   at System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderPa
rameters encoderParams)
   at ConsoleApplication1.Program.Main(String[] args) in C:\images\ConsoleApplic
ation1\ConsoleApplication1\Program.cs:line 24

Не имея возможности воспроизвести его локально, мы посмотрели на изображение поближе и поняли, что существуют артефакты, которые заставляют нас подозревать коррупцию.

Создал уродливый маленький юнит-тест только с изображением, о котором идет речь, и не смог воспроизвести ошибку в Windows 7, как и ожидалось. Но после запуска нашего модульного теста на Windows Server 2008 мы каждый раз видим эту ошибку.

Есть ли способ указать нестрогость для jpegs при их написании? Какую-то проверку / исправление мы можем использовать?

Фрагмент юнит-теста:

 var r = ReadFile("C:\\images\\ConsoleApplication1\\test.jpg");

        using (var imgStream = new MemoryStream(r))
        {
            using (var ms = new MemoryStream())
            {
                var guid = Guid.NewGuid();
                var fileName = "C:\\images\\ConsoleApplication1\\t" + guid + ".jpg";
                Image.FromStream(imgStream).Save(ms, ImageFormat.Jpeg);
                using (FileStream fs = File.Create(fileName))
                {
                    fs.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);
                }
            }

        }

Ответы [ 2 ]

1 голос
/ 19 марта 2010

AFAIK, нет, нет способа попросить GDI + быть более снисходительным при декодировании файлов JPG. В любом приложении, где ваши потребители загружают произвольные файлы JPG, вы увидите, что число таких общих ошибок в исключениях GDI + генерируется постоянно. Вместо этого вы можете попробовать использовать WPF для чтения вашего изображения, но я подозреваю, что оно также будет препятствовать повреждению изображений.

0 голосов
/ 19 марта 2010

Возможно, это не ответ на ваш прямой вопрос, но почему бы вам не извлечь изображение и его md5 (или любой другой хэш), который может проверить правильность этого изображения?

...