【发布时间】:2021-04-01 02:10:54
【问题描述】:
在画布上绘制图像时,devicePixelRatio 等于 2 时它们看起来很好。比率设置为 1 时,图像模糊。如果我将显示缩放设置为 200%(devicePixelRatio = 2),它会再次变得清晰。它也仅在调整图像大小时发生。如果您跳过fitToBox 调用并将画布放大以便您可以看到它,则图像看起来很好。这是一个演示https://jsfiddle.net/7oc1e3ja/
const getImageFromUrl = (context, url, coords) => {
return new Promise(resolve => {
let img = new Image();
img.src = url;
img.onload = () => {
fitToBox(img, coords);
context.drawImage(img, coords.left, coords.top, img.width, img.height);
resolve(img);
}
});
};
const fitToBox = (item, box) => {
let ratio = Math.min(box.width / item.width, box.height / item.height);
item.width *= ratio;
item.height *= ratio;
};
const config = {
imageUrl: 'https://i.imgur.com/y6viWyU.png',
canvas: { width: 300, height: 300 },
};
let box = { ...config.canvas, top: 0, left: 0 },
dpr = window.devicePixelRatio || 1,
canvas = document.getElementById('c'),
context = canvas.getContext('2d');
canvas.width = config.canvas.width * dpr;
canvas.height = config.canvas.height * dpr;
canvas.style.width = config.canvas.width + 'px';
canvas.style.height = config.canvas.height + 'px';
context.scale(dpr, dpr);
getImageFromUrl(context, config.imageUrl, box)
.then(img => document.body.appendChild(img));
【问题讨论】:
-
在成为这个社区的活跃成员 9 年后,您应该更了解我们的标准。说我的代码有问题并且只显示结果的屏幕截图并不是一个好问题。 minimal reproducible example 必须可以从帖子本身访问,而不是外包。对于您的问题,您确定 Windows 机器上的
dpr变量是1吗? IIRC 在操作系统级别有一个默认的 ×1.25 缩放。 -
是的,我确定 dpr 说的是 1。它在 1.25、1.5、小于 2 的任何地方看起来也很糟糕。
-
只是不要设置
canvas.style.width或高度。仅使用 HTML 宽度和高度 -
canvas只是一个包含像素的图像。调整大小时,它被视为图像。如果要保持图像的清晰度,则必须使用width和height属性更改大小以将像素添加到画布,更改CSS 尺寸只是拉伸像素,然后重绘所有项目使用适当比例的画布。 -
更改 CSS 宽度/高度纯粹是为了截图。与问题没有任何关系。注释掉样式更改并运行代码。结果相同。
标签: javascript canvas