」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用畫布調整影像大小時如何克服鋸齒狀邊緣和模糊結果?

使用畫布調整影像大小時如何克服鋸齒狀邊緣和模糊結果?

發佈於2024-11-06
瀏覽:453

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

解決在JavaScript 中使用Canvas 調整影像大小時的平滑問題

在JavaScript 中使用Canvas 調整影像大小有時會導致明顯的鋸齒狀邊緣或模糊。為了實現平滑的調整大小,可以採用一種稱為向下步進的技術。

在大多數瀏覽器中,預設使用線性內插法來調整大小。雙三次插值可產生更平滑的結果,涉及使用更大的像素鄰域。然而,瀏覽器通常不會直接實現雙三次插值。

向下步進法涉及重複調整影像大小,每次使用較小的比例因子。這模仿了雙三次插值的行為,同時仍然在底層瀏覽器中使用線性插值。

以下程式碼片段示範如何實作向下步進:

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