javascript - 如何翻译调整大小的画布?
问题描述
假设我正在将图像绘制到 Javascript 画布上。此外,该图像将在绘图操作期间调整大小,使其水平挤压。这是一些执行此操作的代码:
let dragger = document.querySelector(".dragger");
let canvas = document.querySelector(".my-canvas");
let ctx = canvas.getContext("2d");
var image = new Image();
image.crossOrigin = "Anonymous";
let newWidth = 600;
image.onload = function() {
canvas.width = image.width;
canvas.height = image.height;
dragger.style.left = 0;
ctx.drawImage(image, 0, 0, canvas.width, canvas.height, 0, 0, newWidth, canvas.height);
}
image.src = "https://i.ibb.co/djqSKFW/sample.jpg";
.dragger {
position: absolute;
left: 0;
top: 0;
}
<div class="dragger">
<canvas class="my-canvas" width="1200" height="1200"></canvas>
</div>
这一切都工作正常,正如预期的那样。但是,现在假设您要翻译图像,以便裁剪前 200 个像素。如何做到这一点?
如果图像没有被调整大小很容易,因为您只需将第二个参数设置为drawImage
然后200
执行dragger.style.left = 200;
(以便两个图像对齐),但是一旦引入图像必须保持其压扁宽度的附加约束,它似乎变得更加困难。
请注意,我希望将其绘制到画布上,而不是简单地将外部 div 裁剪为overflow: hidden
. 具体来说,我正在寻找一种方法来绘制正确裁剪的拉伸图像版本。
编辑:作为演示当前不良行为的示例,我制作了一个小提琴,展示了裁剪在此处如何不起作用:https ://jsfiddle.net/604ykmt8/如果你看,你会注意到鸟是如何在这两个图像中都没有排列,即使它们应该。
解决方案
您需要根据比例因子缩放目标 X 偏移量;见下文,改编自您的 JSFiddle 以在同一画布上绘制两个图像,以便更清晰地进行比较。
let canvas = document.querySelector(".my-canvas");
let ctx = canvas.getContext("2d");
var image = new Image();
image.crossOrigin = "Anonymous";
let newWidth = 600;
function tick () {
canvas.width = newWidth;
canvas.height = image.height;
const offset = 200 + Math.sin(+new Date() / 1000) * 200;
const ratio = newWidth / image.width;
ctx.drawImage(image, 0, 0, image.width, canvas.height, 0, 0, newWidth, canvas.height);
ctx.globalAlpha = 0.8;
ctx.drawImage(image, offset, 0, image.width, canvas.height, offset * ratio, 100, newWidth, canvas.height);
requestAnimationFrame(tick);
};
image.src = "https://i.ibb.co/NNJPfG2/sample.jpg";
image.onload = tick;
<canvas class="my-canvas"></canvas>
推荐阅读
- java - Junit 测试失败,mvn clean install for aspectj 装饰类
- postgresql - 如何使用 ansible 设置 postgres 密码
- git - 如何使用 repo init -u 确定最初从 android repo 工具初始化存储库的 URL
? - google-drive-api - 如何将文件从 URL 保存到 Google Drive
- sql-server - SQL Server 图形边缘插入
- html - 如果未设置高度,则不显示 CSS 背景图像(为什么不自动调整?)
- javascript - 可以在括号内设置一个变量,例如我的这个例子吗?
- docker - 如何在 Cypress Docker 容器中安装节点模块?
- python - 在图像文件夹中查找与 id 关联的所有文件?
- c# - 如何从 Xamarin 中的资产文件夹中读取 Json/文本文件