Как я могу изменить размер изображения в C # при сохранении высокого качества? - PullRequest
2 голосов
/ 09 февраля 2011

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

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

Ответы [ 6 ]

6 голосов
/ 09 февраля 2011

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

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

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

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

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

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

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

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

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

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


Дальнейшее чтение

0 голосов
/ 21 ноября 2014

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

0 голосов
/ 09 февраля 2011

Установите CompositingQuality, InterpolationMode и SmoothingMode для объекта Graphics, используемого для изменения размера изображения.

Проверьте ответ на этот вопрос: Высококачественная библиотека масштабирования изображения

0 голосов
/ 09 февраля 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. Это сохранит как можно больше исходного качества изображения.

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

0 голосов
/ 09 февраля 2011

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

0 голосов
/ 09 февраля 2011

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

...