Изменение размера gif-изображения приводит к потере качества

#asp.net #graphics #gdi #image-resizing

#asp.net #графика #gdi #изменение размера изображения

Вопрос:

Я использую Graphics.DrawImage() для изменения размера изображений в моем ASP.NET приложение.

Это отлично работает со всеми форматами изображений, кроме gif.

Вот мое исходное изображение:

введите описание изображения здесь

Когда я изменяю размер на 300px , он возвращает:

введите описание изображения здесь

Код, который я использую, является:

  Dim postedFile as new Bitmap("flower.gif")
 Dim bmpOut As System.Drawing.Bitmap
 Dim Format As ImageFormat = postedFile.RawFormat
 bmpOut = New Bitmap(width, height)
 Dim g As Graphics = Graphics.FromImage(bmpOut)
 g.InterpolationMode = InterpolationMode.High
 g.DrawImage(postedFile, 0, 0, width, height)
 postedFile.Dispose()
 Return bmpOut
 bmpOut.Dispose()
  

Я также пробовал использовать все InterpolationMode доступные, включая InterpolationMode.HighQualityBicubic , но качество изображения по-прежнему такое же низкое.

Почему это происходит, и как я могу предотвратить потерю качества изображения?

Комментарии:

1. Что, если попробовать InterpolationMode. Высококачественный кубик?

2. @x2. Качество изображения такое же низкое с InterpolationMode.HighQualityBicubic

3. Какие другие варианты интерполяции вы пробовали?

4. @ChrisF — Все доступные опции

Ответ №1:

Проблема не в коде изменения размера, который вы опубликовали. Я использовал большое изображение, которое вы опубликовали, и результат выглядит великолепно. Ваша проблема возникает, когда вы сохраняете только что созданное изображение с разрешением 24 бита на пиксель в новый gif-файл с разрешением 8 бит / с. В основном у вас есть два варианта:

  1. Внедрите код для создания оптимизированной цветовой палитры для нового gif (или, возможно, просто используйте палитру из исходного изображения)
  2. Вместо этого сохраните в формате .png, который является совершенно превосходным форматом

Комментарии:

1. Итак, он берет gif-изображение, преобразует его в растровое изображение с более высоким разрешением, затем уменьшает качество, чтобы сохранить его обратно в gif. Я думаю, что это в пределах спецификации для меня, чтобы сохранить его в формате png. Я протестирую это, чтобы увидеть, устраняет ли это проблему, приветствую @danbystrom

2. Приветствую, что моя проблема решена!

Ответ №2:

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

Комментарии:

1. Also, I wouldn't be surprised to find out that whatever routine you're using to convert images to .gif's isn't very concerned about quality. . Какие у вас есть основания предполагать это? Вы можете видеть функцию, которую я использую для изменения размера кода. Я не думаю, что есть что «выяснить».

2. @Curt: Или вы, возможно, неправильно используете функцию преобразования / сохранения, даже если у нее есть параметры, связанные с качеством. Я получаю такие же плохие результаты, как у вас, при сохранении измененного размера gif в XnView с использованием Bayer с 256 цветами или Floyd-Steinberg с 16 цветами. Флойд-Стейнберг с 128 или более цветами создает гораздо, намного лучшее изображение. Тем не менее, я чего-то не знаю. Измененное изображение выглядело настолько плохо на экране еще до сохранения в формате .gif или искажение произошло во время сохранения? Если это последнее, где код для сохранения?

Ответ №3:

Дело не в интерполяции, а в том, что цветовая палитра не настроена для целевого изображения. Вы должны выполнить квантование. Смотрите пример на http://glennjones.net/2005/10/high-quality-dynamically-resized-images-with-dot-net /