#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 бит / с. В основном у вас есть два варианта:
- Внедрите код для создания оптимизированной цветовой палитры для нового gif (или, возможно, просто используйте палитру из исходного изображения)
- Вместо этого сохраните в формате .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 /