javascript - 调整大小时画布会导致图像模糊
问题描述
在画布上绘制图像时,它们看起来很好,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));
解决方案
只需简单地更新您的逻辑以计算dpr
价值:
dpr = Math.max(window.devicePixelRatio || 2, 2),
在这种情况下,您将拥有 HiDPI 画布。
推荐阅读
- java - 如何从 Java 中的 JSON 中提取 JSONArray 和 JSONObject
- javascript - 使用递归按顺序生成二进制字符串
- ngx-bootstrap - bs-sortable selection on perticular item 在拖动时选择完整的网格
- django - 如何以提升的权限运行 django 管理自定义命令?
- php - 如何在 ubuntu 14.04 上为 php 7.2 编译和安装 ext-pdo_sqlite
- angular - 如何在业力测试期间打印日志
- c# - 为什么在 C# 中使用 PKCS7 和 X509Certificate 打开数字签名的 pdf 文档时出现错误?
- php - PHP Include - 在包含的代码中不显示错误
- java - 应用程序不会请求相机许可
- pytorch - Pytorch:为什么 ConvTranspose2d 和 Conv2d 中的权重顺序不同?