Использование ближайшего соседа с CSS-масштабированием на холсте (и img) - PullRequest
22 голосов
/ 06 ноября 2011

При использовании свойства CSS zoom, как я могу убедить браузер использовать "ближайший сосед" вместо "билинейный" или любые другие более продвинутые алгоритмы масштабирования?

Моя установка - это div, который содержит холст, и div использует масштабирование с помощью JavaScript равным <div style="zoom:3200%">...</div>, и для получения ближайшего соседа я использую image-rendering: -webkit-optimize-contrast в своем CSS. Приложение доступно здесь ('z' увеличивает масштаб, 'shift-z' уменьшает обратно), и мой css равен здесь

Вот требуемый эффект в Chrome для OSX (для увеличения установлено значение 3200%): zoom on OSX/Chrome using nearest neighbor

Но в Chrome на Windows 7 происходит то же самое: zoom on Windows/Chrome not using nearest neighbor

В обоих случаях это «ванильный» Chrome (версия 15.x.x) из коробки, никакие экспериментальные флаги не включены.

Как убедить Chrome в Windows использовать ближайшего соседа? Кстати, как я могу убедить все браузеры? Safari также не использует ближайшего соседа (пока приложение работает только в браузерах на основе WebKit)

Свойство CSS image-rendering влияет на Chrome / OSX и дает мне желаемый эффект. Но Chrome / Windows и Safari (5.1) / OSX, похоже, полностью игнорируют это. Что-то подсказывает мне, что мне просто не повезло, но я решил спросить.

Использование zoom в контейнере div очень просто и прекрасно работает в Chrome / OSX, если я должен прибегнуть к внутреннему масштабированию своих полотен, я тоже могу это сделать. Но предпочел бы буквально одну строку кода, если это возможно!

ОБНОВЛЕНИЕ: Я нашел использование image-rendering: optimizeSpeed подсказок. Однако это кажется привередливым в Chrome / Windows. Если я установлю слишком много элементов (я изначально пробовал, мои контейнеры и все холсты), это не вступит в силу. Но если я применю это только к canvas, я получу 98% пути.

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

UPDATE2: Кажется, что image-rendering в Chrome / Windows просто не реализован должным образом и немного глючит. Теперь я могу подтвердить, что значения optimizeSpeed и optimizeQuality не поддерживаются в Chrome / Windows. Если вы установите для них рендеринг изображений, Chrome проигнорирует этот набор. Chrome / Windows распознает -webkit-optimize-contrast, но не использует его последовательно. Chrome будет переключаться между алгоритмом билинейного масштабирования и ближайшим соседом почти случайно. Я не смог последовательно заставить Chrome использовать ближайшего соседа.

Я попытался собрать Chromium 17 на Windows, и он ведет себя так же.

Firefox (8.0.1) выглядит довольно многообещающе, хотя, похоже, он довольно хорошо соблюдает -moz-crisp-edges. Изначально я выбрал Chrome как «идеальный браузер» для этого приложения, я мог бы просто переключиться на Firefox.

В конце концов, похоже, что правильная поддержка image-rendering находится в стадии разработки для Chrome, но пока еще не совсем. Сам WebKit утверждает, что полностью поддерживает все значения рендеринга изображений, но я предполагаю, что сборка WebKit, которую использует Chrome, не совсем обновлена ​​до этого нового исправления.

Ответы [ 3 ]

7 голосов
/ 27 декабря 2011

Есть способ. Я задал вопрос, подобный этому, здесь: Как растянуть изображения без сглаживания и получил действительно хороший ответ. С тех пор я немного его изменил, но вот простая версия, которая растягивается (без сглаживания) при нажатии: http://jsfiddle.net/howlermiller/U2eBZ/1/

Это невероятно хакерский. Не используйте его, если не должны. Он должен заново создавать изображение каждый раз, когда вы нажимаете на него, поэтому с большим изображением это будет медленно и ужасно. Но он работает на Chrome / Windows.

Редактировать: Это поддерживается в спецификации CSS3 сейчас! Поддержка супер пятнистая на данный момент, но Chrome только что добавил поддержку так что я надеюсь, что мы сможем использовать его в ближайшее время. Хорошие времена!

.thing { image-rendering: pixelated; }

1 голос
/ 16 июня 2013

ctx.webkitImageSmoothingEnabled = false теперь, кажется, работает с 22.

1 голос
/ 27 декабря 2011

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

Я подозреваю, что даже если вы решите эту проблему, однажды вы столкнетесь с чем-то другим..

@ В ответе Тимоти, кажется, есть хороший код, который вы можете использовать, чтобы помочь с реальной математикой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...