Как работает подсказка пикселей?

В этом вопросе пользователь спрашивает, как он может создать векторное изображение, которое плавно уменьшается.

Подсказка пикселей - это решение:

Сглаживание обрабатывает каждый край как гвоздь, разбивая и сглаживая без ограничений. Если не подскажете!

Как это сделано...

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

Во-первых, откройте документ, содержащий векторную фигуру, которую вы хотите указать в пикселях. Этот метод отлично работает, если вы работаете с вектором, хотя, если вы работаете с растровыми фигурами, хинтование пикселей вполне управляемо, но только для продвинутых. Итак, давайте пока остановимся на векторных фигурах.

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

В-третьих, выберите точки на вашем векторном пути и перемещайте пиксели с помощью клавиш со стрелками с шагом в минуту. Некоторые приложения требуют, чтобы вы удерживали кнопку нажатой, некоторые — нет. До тех пор, пока вы знаете, что пути не просто сдвигаются на пиксель вверх — потому что вы хотите, чтобы они сдвигались максимум на полпикселя вверх.

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

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

- Исходная статья The Industry, любезно предоставленная tareq-a.


Подсказка пикселей с векторными формами сообщает системе рендеринга намерение края, поэтому сглаживание знает, следует ли взмахнуть своим сглаживающим молотком!

Но я не понимаю, как это работает. Поскольку данные SVG хранятся в XML, не похоже, что с этими данными будет сохранена какая-либо пиксельная «карта». Другими словами, кажется, что формы будут храниться отдельно и, конечно же, не будут сопоставлены с определенными пикселями.

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

Может кто-нибудь объяснить, как работает подсказка пикселей?

> Обратите внимание, однако, что это работает только для одного конкретного размера вашего > SVG или любого последующего более крупного рендеринга, кратного > исходному. На самом деле, вы можете оптимизировать для разных размеров, используя медиа-запросы. Это немного сложная техника, но вы можете создавать отдельные версии в разных группах SVG и скрывать/отображать их в зависимости от размера во время рендеринга. Я протестировал это, и оно работает даже при использовании в качестве фоновых изображений в HTML. smashingmagazine.com/2014/03/05/переосмысление-отклик-svg

Ответы (2)

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

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

Что касается того, как это работает в SVG, посмотрите на исходный код SVG-файла, и вы поймете, что происходит.

В открывающем SVGтеге много атрибутов, два определяют ширину и высоту. В SVG, который у меня есть на рабочем столе, они установлены как таковые:

<svg width="744.09448819" height="1052.3622047" ...

Как видите, мой конкретный SVG не имеет определенной ширины/высоты в пикселях. Я мог бы настроить свой SVG так, чтобы он был ТОЧНО столько-то пикселей на такое-то количество пикселей, а затем, исходя из этого, в моем редакторе SVG я мог бы включить пиксельную сетку, чтобы гарантировать, что все мои вертикальные и горизонтальные линии пересекаются точно между двумя пикселями. .

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

Таким образом, то, что автор этой статьи называет «подсказкой по пикселям», просто берет ваш файл SVG и гарантирует, что каждая строка «привязывается» к определенной единице пикселя. Это будет создано редактором SVG, который вы используете, и реализовано через браузер, отображающий изображение на основе атрибутов ширины/высоты.

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

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

Например, возможно, ваш SVG имеет размер 100 x 100 пикселей. Ваши линии могут гарантированно оставаться «четкими до пикселя», только если вы отображаете SVG точно в размере 100x100, 200x200, 300x200, 400x400 и т. д.

Я предполагаю, что "хинтинг пикселей" работает путем идеального выравнивания графических элементов по пикселям:

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

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

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

Для ОП важно понимать, что полупикселя не существует. Пиксель — это наименьшая единица памяти, используемая для хранения данных изображения (даже для векторов, поскольку на этом этапе вектор преобразуется в пиксельную сетку для вывода или отображения).
@horatio Как вы думаете, каждый виртуальный пиксель идеально соответствует физическому?
Нет, но я думаю, что это крайне важно для понимания того, что происходит. Подсказка пикселей, представленная в примере OP, основана на предположении, что сетка пикселей будет одинаковой на случайных клиентских машинах. Это не безопасное предположение. (но может быть правдой в 80% случаев)
@horatio , если агент рендеринга поддерживает ширину/высоту SVG и SVG визуализируется с этим размером, тогда значение по умолчанию должно соответствовать пиксельной сетке. Но, безусловно, есть много, много способов, когда это может быть не так (например, пользователь может изменить масштаб своего браузера).
@ da01: я согласен в общем смысле, но файлы SVG по существу безразмерны, а выравнивание пиксельной сетки предполагает определенный размер экрана, см., например, файл справки Illustrator: «Четкий вид штрихов, выровненных по пикселям, сохраняется в растровом выводе при разрешении только 72 ppi. Для других разрешений существует высокая вероятность того, что такие штрихи приведут к сглаженным результатам ». Единственная причина, по которой я проявляю здесь педантичность, заключается в том, что вопрос касается основных причин, и поэтому я думаю, что это разумная придирка.
@horatio SVG использует единицы измерения и имеет систему координат, состоящую из пикселей: w3.org/TR/SVG11/coords.html#InitialCoordinateSystem . Поскольку размер SVG обычно определяется с помощью пикселей в CSS, разрешение экрана не имеет значения, но только при отображении SVG в размере по умолчанию
Во втором абзаце этого раздела предлагается «[...] если пользовательский агент может определить размер единицы пикселей из своей среды, он должен использовать это значение; в противном случае он должен выбрать подходящий размер для одной единицы пикселей. " Это сложно