System.Drawing.Image Save (), создающий несоответствующие размеры файлов - PullRequest
0 голосов
/ 26 января 2012

При преобразовании файлов TIFF в PDF я заметил, что некоторые PDF-файлы были повреждены.После некоторых исследований выясняется, что проблема в классе System.Drawing.Image.Чтобы проверить это, вместо преобразования в PDF-файлы, я просто прочитал программу в файлах изображений и заново сохранил их.Некоторые из недавно сохраненных файлов имеют несовместимые размеры файлов при разных запусках программы.Основные шаги:

  1. Я читаю изображение TIFF в байтовый массив.
  2. Я использую метод System.Drawing.Image.FromStream () для создания объекта изображения из байтового массива.
  3. Затем я вызываю метод System.Drawing.Image.Save (stream) для сохранения изображения в новом потоке.
  4. Затем я проверяю длину метода stream.ToArray ().

Один и тот же входной файл приводит к разной длине вывода при последовательном выполнении программы.Длина вывода варьируется на пару сотен байтов.Кроме того, результирующая длина вывода более чем в два раза больше длины ввода, но я предполагаю, что это связано со сжатием или его отсутствием.Я запускаю это на Windows 7 32-разрядной с .net 4.

Почему длина вывода может изменяться следующим образом?

ОБНОВЛЕНИЕ:

После рассмотрения этой проблемы подключения (https://connect.microsoft.com/VisualStudio/feedback/details/584681/system-drawing-image-flags-has-different-value-in-vista-and-windows-7) и комментарии сообщества на этой странице MSDN (http://msdn.microsoft.com/en-us/library/system.drawing.image.save.aspx), похоже, что проблема связана с ошибкой на уровне операционной системы в Windows 7. Может кто-нибудь подтвердить это или предложить обходной путь?

Ответы [ 2 ]

1 голос
/ 14 мая 2012

Я вижу похожую проблему на 64-битном сервере Windows 2008: загрузка одного и того же TIFF и его повторное сохранение приведет к разным файлам при разных запусках.Поэтому я не думаю, что она специфична для Windows 7. Я написал следующую программу на C #, чтобы показать ее:

for (int i = 0; i < 2000; i++)
            {

                sourceToConvert = Bitmap.FromFile("c:\\tmp\\png\\zip\\fig_AAAW_6.tif");
                sourceToConvert.Save("c:\\tmp\\png\\fig_AAAW_6_regen.png", ImageFormat.Png);

                if (!CompareFileBytes("c:\\tmp\\png\\fig_AAAW_6_gen.png", "c:\\tmp\\png\\fig_AAAW_6_regen.png"))
                    MessageBox.Show("Diff" + i);                
            }

Это покажет «Diff» на итерации 8, 32, 33, 73, 114,155, 196, ... на 64-битных машинах, в то время как он генерирует точно такие же файлы на 32-битных машинах при компиляции с целевым процессором x86.Когда я использую 64-битную цель, это ухудшается: файлы отличаются на итерации 12, 13, 14, 15, ...

.

0 голосов
/ 01 февраля 2012

Как указано в моем обновлении, после рассмотрения этой проблемы с подключением (https://connect.microsoft.com/VisualStudio/feedback/details/584681/system-drawing-image-flags-has-different-value-in-vista-and-windows-7) и комментариев сообщества на этой странице MSDN (http://msdn.microsoft.com/en-us/library/system.drawing.image.save.aspx),, похоже, проблема связана с ошибкой на уровне операционной системы Windows).7.

Кроме того, когда изображения считываются в Windows XP, свойство flags для объекта изображения устанавливается в 77888. В Win7 оно устанавливается в 77840. После просмотра документации MSDN для свойства flags(http://msdn.microsoft.com/en-us/library/system.drawing.image.flags.aspx), разница в том, что WinXP пометил изображение как изображение в градациях серого (которое у меня есть), но Win7 пометил его как изображение RGB. Это кажется признаком проблемы, но я не знаю,достаточно о форматах изображений и цветовых пространствах, чтобы говорить об этом авторитетно.

...