Подтвердить что ты не робот

Улучшение качества изображения элементов с уменьшенным CSS

Я уменьшаю содержимое моего удивительного редактора графов, используя transform: scale(x). При масштабировании масштаб уменьшается до 0 (эксклюзивный), когда масштабирование увеличивается, до максимального значения 1 (включительно), что означает полный масштаб или начальный масштаб.

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

var graphContainer = document.getElementById("graph-container");
var zoomInButton = document.getElementById("zoom-in-button");
var zoomOutButton = document.getElementById("zoom-out-button");
var zoomLevel = 1;

zoomInButton.addEventListener("click", function () {
    zoomLevel = Math.max(1, zoomLevel - 0.25);
    graphContainer.style.transform = "scale(" + (1 / zoomLevel) + ")";
});

zoomOutButton.addEventListener("click", function () {
    zoomLevel = zoomLevel + 0.25;
    graphContainer.style.transform = "scale(" + (1 / zoomLevel) + ")";
});
#editor-container {
    background-color: #001723;
}

#graph-container { transform-origin: top center; }
<div id="editor-container">
    <button id="zoom-in-button">Zoom in</button>
    <button id="zoom-out-button">Zoom out</button>
    <div id="graph-container">
        <img class="shape" src="http://i.imgur.com/zsWkcGz.png" />
    </div>
</div>
4b9b3361

Ответ 1

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

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

Код SVG:

<svg class="shape" width="440px" height="319px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <path d="M1,316.040132 C1,316.040132 241.5837,339.680482 241.5837,163.497447 C241.5837,-12.6855883 439,2.31775322 439,2.31775322" id="Path" stroke="#50E3C2" stroke-width="2"></path>
    </g>
</svg>

Очевидно, что это не идеально.

Ответ 2

Интерполяция изображения с острым краем неизбежно создаст артефакты. Даже если он антиализован, даже если он размыт. Вы можете проверить это в самом Photoshop, вы получите тот же результат.

Даже подход mipmap не будет работать.

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

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