Maison > interface Web > js tutoriel > le corps du texte

Comment surmonter les bords irréguliers et les résultats flous lors du redimensionnement des images avec Canvas ?

DDD
Libérer: 2024-10-22 20:40:03
original
652 Les gens l'ont consulté

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

Résoudre les problèmes de lissage lors du redimensionnement d'images à l'aide de Canvas en JavaScript

Le redimensionnement d'images à l'aide de Canvas en JavaScript peut parfois entraîner des bords irréguliers ou un flou visibles. Pour obtenir des redimensionnements fluides, une technique connue sous le nom de down-stepping peut être utilisée.

Dans la plupart des navigateurs, l'interpolation linéaire est utilisée par défaut pour le redimensionnement. L'interpolation bi-cubique, qui produit des résultats plus fluides, implique l'utilisation d'un plus grand voisinage de pixels. Cependant, les navigateurs n'implémentent généralement pas directement l'interpolation bi-cubique.

L'approche descendante consiste à redimensionner l'image à plusieurs reprises, en utilisant à chaque fois un facteur d'échelle plus petit. Cela imite le comportement de l'interpolation bi-cubique tout en utilisant l'interpolation linéaire dans le navigateur sous-jacent.

L'extrait de code suivant montre comment implémenter la réduction :

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";
Copier après la connexion

Ce code crée un toile temporaire, oc, et redimensionne l'image de manière itérative, pour finalement la dessiner sur la toile finale. Chaque étape de redimensionnement utilise une interpolation linéaire, mais en les combinant, l'effet global se rapproche d'une interpolation bi-cubique.

La propriété imageSmoothingQuality peut également être utilisée pour contrôler la qualité du lissage dans Chrome, offrant ainsi un moyen plus direct d'obtenir une fluidité. , mais il n'est pas encore pris en charge dans tous les navigateurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal