«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как преодолеть неровные края и размытые результаты при изменении размера изображений с помощью Canvas?

Как преодолеть неровные края и размытые результаты при изменении размера изображений с помощью Canvas?

Опубликовано 6 ноября 2024 г.
Просматривать:468

How to Overcome Jagged Edges and Blurry Results When Resizing Images with Canvas?

Устранение проблем со сглаживанием при изменении размера изображений с использованием холста в JavaScript

Изменение размера изображений с использованием холста в JavaScript иногда может приводить к заметным неровным краям или размытию. Чтобы добиться плавного изменения размера, можно использовать метод, известный как понижение размера.

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

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

Следующий фрагмент кода демонстрирует, как реализовать понижающую интерполяцию:

var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var img = new Image();

img.onload = function () {

    // set size proportional to image
    canvas.height = canvas.width * (img.height / img.width);

    // step 1 - resize to 50%
    var oc = document.createElement('canvas'),
        octx = oc.getContext('2d');

    oc.width = img.width * 0.5;
    oc.height = img.height * 0.5;
    octx.drawImage(img, 0, 0, oc.width, oc.height);

    // step 2
    octx.drawImage(oc, 0, 0, oc.width * 0.5, oc.height * 0.5);

    // step 3, resize to final size
    ctx.drawImage(oc, 0, 0, oc.width * 0.5, oc.height * 0.5,
    0, 0, canvas.width, canvas.height);
}
img.src = "//i.imgur.com/SHo6Fub.jpg";

Этот код создает временный холст oc и итеративно изменяет размер изображения, в конечном итоге рисуя его на окончательном холсте. На каждом этапе изменения размера используется линейная интерполяция, но при их объединении общий эффект приближается к бикубической интерполяции.

Свойство imageSmoothingQuality также можно использовать для управления качеством сглаживания в Chrome, обеспечивая более прямой способ достижения плавности. , но он пока поддерживается не во всех браузерах.

Заявление о выпуске Эта статья перепечатана по адресу: 1729599438. В случае каких-либо нарушений, пожалуйста, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3