Расширение файла из System.Drawing.Image - PullRequest
2 голосов
/ 04 сентября 2010

Я пишу метод, который должен сохранить System.Drawing.Image в файл. Не зная оригинального файла, из которого был создан Image, есть ли способ определить, какое расширение файла у него должно быть?

Лучшее решение, которое я придумал, - это использование оператора Switch / Case со значением Image.RawFormat.

Имеет ли значение, что я сохраняю Image в его оригинальном формате? Image, сгенерированный из PNG, отличается от, скажем, сгенерированного из JPEG? Или данные, хранящиеся в Image объекте, являются полностью общими?

Ответы [ 4 ]

2 голосов
/ 04 сентября 2010

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

Это означает, что вы можете сохранить егов любой формат файла, который вы хотите.

Однако, если вы загружаете изображение JPG, а затем сохраняете его как другой файл JPG, вы выбрасываете больше информации из-за алгоритма сжатия.Если вы сделаете это несколько раз, вы в конечном итоге потеряете изображение.

Если вы можете, я бы рекомендовал всегда сохранять в формате PNG.

1 голос
/ 04 сентября 2010

Image.RawFormat имеет полезности, держитесь подальше от него.Я видел несколько сообщений о том, что это не имеет никакого юридического значения без видимой причины.Пока не диагностировано.

Вы совершенно правы, не имеет значения, в каком формате вы сохраните его.После загрузки файла внутренний формат одинаков для любого растрового изображения (не векторного) с таким же форматом пикселей.Как правило, избегайте повторного сжатия файлов JPEG, они имеют тенденцию увеличиваться и приобретать больше артефактов.Стив упоминает о многокадровых файлах, их нужно сохранять другим способом.

0 голосов
/ 04 сентября 2010

Чтобы ответить на ваш вопрос «Имеет ли значение, что я сохраняю изображение в его оригинальном формате?» явно: Да, но отрицательно.

Когда вы загружаете изображение, оно внутренне распаковывается в растровое изображение (или, как его называет ChrisF , поток несжатых данных). Таким образом, если исходное изображение использовало сжатие с потерями (например, JPEG), сохранение его в том же формате снова приведет к потере информации (то есть больше артефактов, меньше деталей, меньше качества). Особенно, если вы повторили действия чтение - изменение - сохранение , этого следует избегать.

(Обратите внимание, что этого также следует избегать, если вы не изменяете изображение. Только повторные циклы распаковки - сжатия ухудшат качество изображения).

Так что, если здесь не проблема с дисковым пространством (и обычно это не в эпоху жестких дисков, которые достаточно велики для HD-видео), всегда храните любые промежуточные изображения в форматах сжатия без потерь или без сжатия. Вы можете сохранить окончательный вывод в сжатом формате, в зависимости от того, для чего вы его используете. (Если вы хотите представить эти окончательные изображения в Интернете, jpeg или png будет хорошим выбором).

0 голосов
/ 04 сентября 2010

Да, это определенно важно, потому что разные форматы файлов поддерживают разные функции, такие как сжатие, несколько кадров и т. Д.

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

...