我使用 html5画布元素在浏览器中调整图像的大小。结果证明质量非常低。我发现这个: 当缩放一个 < 画布 > 时禁用插值,但它不帮助提高质量。
下面是我的 css 和 js 代码以及用 Photoshop 调用并在画布 API 中缩放的图像。
在浏览器中缩放图像时,我需要做什么才能获得最佳质量?
注意: 我想缩小一个较大的图像到一个较小的,修改画布的颜色,并将结果从画布发送到服务器。
CSS:
canvas, img {
image-rendering: optimizeQuality;
image-rendering: -moz-crisp-edges;
image-rendering: -webkit-optimize-contrast;
image-rendering: optimize-contrast;
-ms-interpolation-mode: nearest-neighbor;
}
约翰逊:
var $img = $('<img>');
var $originalCanvas = $('<canvas>');
$img.load(function() {
var originalContext = $originalCanvas[0].getContext('2d');
originalContext.imageSmoothingEnabled = false;
originalContext.webkitImageSmoothingEnabled = false;
originalContext.mozImageSmoothingEnabled = false;
originalContext.drawImage(this, 0, 0, 379, 500);
});
使用 Photoshop 调整图像大小:
图片在画布上调整大小:
编辑:
我试图通过以下几个步骤来缩小规模:
在 HTML5画布 和 Html5画布图像: 如何应用反锯齿
这是我使用的函数:
function resizeCanvasImage(img, canvas, maxWidth, maxHeight) {
var imgWidth = img.width,
imgHeight = img.height;
var ratio = 1, ratio1 = 1, ratio2 = 1;
ratio1 = maxWidth / imgWidth;
ratio2 = maxHeight / imgHeight;
// Use the smallest ratio that the image best fit into the maxWidth x maxHeight box.
if (ratio1 < ratio2) {
ratio = ratio1;
}
else {
ratio = ratio2;
}
var canvasContext = canvas.getContext("2d");
var canvasCopy = document.createElement("canvas");
var copyContext = canvasCopy.getContext("2d");
var canvasCopy2 = document.createElement("canvas");
var copyContext2 = canvasCopy2.getContext("2d");
canvasCopy.width = imgWidth;
canvasCopy.height = imgHeight;
copyContext.drawImage(img, 0, 0);
// init
canvasCopy2.width = imgWidth;
canvasCopy2.height = imgHeight;
copyContext2.drawImage(canvasCopy, 0, 0, canvasCopy.width, canvasCopy.height, 0, 0, canvasCopy2.width, canvasCopy2.height);
var rounds = 2;
var roundRatio = ratio * rounds;
for (var i = 1; i <= rounds; i++) {
console.log("Step: "+i);
// tmp
canvasCopy.width = imgWidth * roundRatio / i;
canvasCopy.height = imgHeight * roundRatio / i;
copyContext.drawImage(canvasCopy2, 0, 0, canvasCopy2.width, canvasCopy2.height, 0, 0, canvasCopy.width, canvasCopy.height);
// copy back
canvasCopy2.width = imgWidth * roundRatio / i;
canvasCopy2.height = imgHeight * roundRatio / i;
copyContext2.drawImage(canvasCopy, 0, 0, canvasCopy.width, canvasCopy.height, 0, 0, canvasCopy2.width, canvasCopy2.height);
} // end for
// copy back to canvas
canvas.width = imgWidth * roundRatio / rounds;
canvas.height = imgHeight * roundRatio / rounds;
canvasContext.drawImage(canvasCopy2, 0, 0, canvasCopy2.width, canvasCopy2.height, 0, 0, canvas.width, canvas.height);
}
如果我使用2步缩小规模,结果如下:
如果我使用3步缩小规模,结果如下:
如果我使用4步缩小规模,结果如下:
如果我使用20步缩小规模,结果如下:
注意: 结果表明,从1步到2步,图像质量有了很大的提高,但是添加到过程中的步骤越多,图像就变得越模糊。
有没有一种方法可以解决这个问题: 你添加的步骤越多,图像就越模糊
编辑2013-10-04: 我尝试了游戏炼金术师的算法。这里是比较 Photoshop 的结果。
PhotoShop 图片来源:
游戏炼金术士算法: