【发布时间】:2015-04-04 06:15:55
【问题描述】:
我正在尝试在画布上绘制图像,然后使用 css 使画布适合特定大小。事实证明,许多浏览器并不能很好地缩小画布。 OS X 上的 Firefox 似乎是最差的之一,但我没有测试过很多。这是该问题的一个最小示例:
HTML
<img>
<canvas></canvas>
CSS
img, canvas {
width: 125px;
}
JS
var image = document.getElementsByTagName('img')[0],
canvas = document.getElementsByTagName('canvas')[0];
image.onload = function() {
canvas.width = image.width;
canvas.height = image.height;
var context = canvas.getContext('2d');
context.drawImage(image, 0, 0, canvas.width, canvas.height);
}
image.src = "http://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Helvetica_Neue_typeface_weights.svg/783px-Helvetica_Neue_typeface_weights.svg.png"
在代码笔中运行:http://codepen.io/ford/pen/GgMzJd
这是 Firefox 中的结果(Retina 显示屏的屏幕截图):
发生的情况是<img> 和<canvas> 都以相同的大小开始,并由浏览器使用 css 缩小(图像宽度为 783px)。显然,浏览器在<img> 上做了一些很好的平滑/插值,但在<canvas> 上没有。
我试过了:
-
image-rendering,但默认值似乎已经是我想要的。 - 像scaling the image down in steps 这样的黑客解决方案,但这没有帮助:http://codepen.io/ford/pen/emGxrd。
-
Context2D.imageSmoothingEnabled,但再一次,默认值描述了我想要的。
如何使右侧的图像看起来像左侧的图像?最好用尽可能少的代码(例如,我不想自己实现双三次插值)。
【问题讨论】:
-
浏览器对 HTML 5 Canvas 有一个非常简单的下采样,see this answer here。
-
这个答案是我试图避免的一个完美例子:一个极其复杂的黑客攻击(看起来像)严重的性能影响。
-
也许使用媒体查询来提供更接近显示尺寸的图像,因此调整大小不会那么明显?