Последнее обновление: 2014-09-12
Есть ли свойство canvas или настройка браузера, которые я могу программно изменить, чтобы отключить интерполяцию при масштабировании элементов?
Ответ может быть, когда-нибудь . Пока вам придется прибегать к хакерским атакам, чтобы получить то, что вы хотите.
image-rendering
Рабочий проект CSS3 обрисовывает в общих чертах новое свойство, image-rendering
, которое должно делать то, что я хочу:
Свойство рендеринга изображения дает подсказку пользовательскому агенту о том, какие аспекты изображения наиболее важно сохранить при масштабировании изображения, чтобы помочь пользовательскому агенту в выборе подходящего алгоритма масштабирования.
В спецификации указаны три допустимых значения: auto
, crisp-edges
и pixelated
.
некачественно:
При увеличении изображения необходимо использовать «ближайший сосед» или аналогичный алгоритм, чтобы изображение казалось просто составленным из очень больших пикселей. При уменьшении это то же самое, что и auto.
Стандартный? Кросс-браузер?
Поскольку это всего лишь рабочий проект , нет гарантии, что это станет стандартом. В настоящее время поддержка браузеров в лучшем случае ненадежная.
Mozilla Developer Network имеет довольно подробную страницу, посвященную современному состоянию , которую я настоятельно рекомендую прочитать.
Разработчики Webkit изначально решили предварительно реализовать это как -webkit-optimize-contrast
, но Chromium / Chrome, похоже, не использует версию Webkit, которая реализует это.
Обновление: 2014-09-12
Chrome 38 теперь поддерживает image-rendering: pixelated
!
У Firefox есть отчет об ошибках , открытый для реализации image-rendering: pixelated
, но -moz-crisp-edges
пока работает.
Решение
Самое кроссплатформенное решение, предназначенное только для CSS, пока таково:
canvas {
image-rendering: optimizeSpeed; /* Older versions of FF */
image-rendering: -moz-crisp-edges; /* FF 6.0+ */
image-rendering: -webkit-optimize-contrast; /* Safari */
image-rendering: -o-crisp-edges; /* OS X & Windows Opera (12.02+) */
image-rendering: pixelated; /* Awesome future-browsers */
-ms-interpolation-mode: nearest-neighbor; /* IE */
}
К сожалению, это пока не работает на всех основных платформах HTML5 (в частности, в Chrome).
Конечно, можно вручную масштабировать изображения с помощью интерполяции ближайших соседей на поверхности холста высокого разрешения в javascript или даже предварительно масштабировать изображения на стороне сервера, но в моем случае это будет чрезмерно дорогостоящим, так что это не жизнеспособный вариант.
ImpactJS использует технику предварительного масштабирования текстуры, чтобы обойти весь этот FUD. Разработчик Impact, Доминик Сзаблевски, написал очень подробную статью об этом (он даже закончил ссылаться на этот вопрос в своем исследовании).
См. ответ Саймона о решении на основе холста, которое опирается на свойство imageSmoothingEnabled
(недоступно в старых браузерах, но проще, чем предварительное масштабирование и довольно широко поддерживается).
Live Demo
Если вы хотите протестировать свойства CSS, обсуждаемые в статье MDN для canvas
элементов, я сделал эту скрипку , которая должна отображать что-то вроде этого, размытое или нет, в зависимости от вашего браузер: