Как изменить размер изображения на C # при сохранении высокого качества?

Я нашел статью об обработке изображений отсюда: http://www.switchonthecode.com/tutorials/csharp-tutorial-image-editing-saving-cropping-and-resizing Все работает нормально.

Я хочу сохранить высокое качество при изменении размера изображения. Думаю, если мне удастся увеличить значение DPI, я смогу этого добиться. Кто-нибудь знает возможно ли это? И если да, то как я могу реализовать это на C #?


person yohan.jayarathna    schedule 09.02.2011    source источник
comment
В каком направлении вы меняете размер? Новое изображение меньше или больше, чем исходное изображение?   -  person Cody Gray    schedule 09.02.2011
comment
youtube.com/watch?v=3uoM5kfZIQ0   -  person cwap    schedule 09.02.2011


Ответы (5)


Для начала стоит отметить, что есть две общие категории изображений; вектор [например, SVG, WMF, Adobe Illustrator и Corel Draw Graphics] и растровые (также называемые растровыми) изображениями [например, Растровые изображения, изображения JPEG и PNG].

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

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

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

Конечно, применяя интерполяцию и фильтрацию, компьютер может «сгладить» края целевых пикселей, чтобы они, казалось, сливались друг с другом и создавали вид изображения с разумно измененным размером, но этот результат никогда не будет таким же, как изменение размера вектора. изображение; векторные изображения отлично меняют размер.

Вы также упомянули DPI в своем вопросе. DPI - это, по сути, количество пикселей, которое соответствует дюйму при распечатке изображения, а не при его просмотре на экране. Следовательно, увеличивая DPI изображения, вы не увеличиваете размер изображения на экране. Вы только повышаете качество печати [что, разумеется, зависит от максимального разрешения принтера].

Если вы действительно хотите изменить размер изображения, а изображение является растровым, как правило, не увеличивайте размер более 200% от размера исходного изображения, иначе вы потеряете качество.

Вы можете увидеть в этом ответе для кода для изменения размера растровых изображений.

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

Типичным растровым изображением являются спрайты StackOverflow. Их размер не меняется.


Дополнительная информация

person Alex Essilfie    schedule 09.02.2011

Просто если исходное изображение меньше, чем изображение с измененным размером, то вы вряд ли сможете что-либо сделать. Отдых - проблема исследования.

person Shekhar_Pro    schedule 09.02.2011

Это было бы возможно, только если это векторная графика. Взгляните на SVG. В противном случае, я думаю, вам может понадобиться Silverlight или Flex для этой части.

person Zesty    schedule 09.02.2011

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

Лучшее, что вы можете сделать, - это установить свойство InterpolationMode объекта Graphics, который вы используете для изменения размера до «HighQualityBicubic», который является алгоритмом сглаживания высочайшего качества, поддерживаемым GDI + и фактически всеми основными графическими пакетами на рынке. Это лучшее, что может предложить даже Adobe Photoshop. По сути, интерполяция означает, что компьютер вычисляет приблизительное значение новых пикселей, которые вы добавляете, чтобы увеличить изображение по сравнению с относительными значениями соседних пикселей. Это метод "наилучшего предположения", но это лучший компромисс, который мы когда-либо придумали.
По крайней мере, на полученных изображениях не будет "неровностей" или грубых пиксельных линий.

Образец кода:

Graphics g;
g.InterpolationMode = Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
// ... insert the rest of your code here

Помимо этого, стоит отметить, что GDI + (который .NET Framework использует внутри для графических процедур) лучше всего работает с размерами изображений, кратными 16. Так что, если все это возможно, вы должны попытаться установить ширину и высоту ваших изображений с измененным размером кратное 16. Это позволит максимально сохранить исходное качество изображения.

Идеальное решение - перейти на векторную графику, размер которой можно изменять по желанию. Вместо информации о пикселях они содержат математическую информацию, используемую для рисования или «визуализации» изображения. Подробнее читайте в Википедии.

person Cody Gray    schedule 09.02.2011

попробуем метаданные в GDI +, может быть под ваш запрос

person Lâm Ánh    schedule 21.11.2014