html5-canvas - 使用画布调整图像尺寸并旋转 90 度
问题描述
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var width = 0;
var height = 0;
var diagonal = 0;
var image = new Image();
image.crossOrigin = 'Anonymous';
image.src = `source url`;
image.onload = () => {
width = image.naturalHeight;
height = image.naturalWidth;
diagonal = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2));
ctx.canvas.height = diagonal;
ctx.canvas.width = diagonal;
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.save();
ctx.translate(diagonal / 2, diagonal / 2);
ctx.rotate((0 * Math.PI) / 180);
ctx.drawImage(image, -width / 2, -height / 2);
ctx.restore();
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.save();
ctx.translate(diagonal / 2, diagonal / 2);
ctx.rotate((90 * Math.PI) / 180);
ctx.save();
canvas.height = image.height;
canvas.width = image.width;
ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
ctx.restore();
console.log(canvas.toDataURL("image/jpeg"))
};
<canvas id="canvas"></canvas>
我有一张尺寸为 1200x900 的图像。我想将它顺时针旋转 90 度,旋转后再次将其尺寸更改为 1200*900。如何使用 HTML5 的画布做到这一点。
我在这里附上图片。
我希望目标图像的大小为 1200x900。请让我知道,如何做到这一点。
解决方案
我没有看到您计算高度和宽度之间比率的任何地方......
我们计算它并在我们的应用中使用它drawImage
来减小尺寸。
...请参阅下面的示例:
我将画布大小保持为原始图像以在背景中显示它
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var image = new Image();
image.src = "http://i.stack.imgur.com/UFBxY.png";
image.onload = () => {
canvas.height = image.naturalHeight;
canvas.width = image.naturalWidth;
// original image
ctx.globalAlpha = 0.2;
ctx.drawImage(image, 0, 0);
ctx.rect(0, 0, canvas.width, canvas.height);
ctx.fill()
// rotated image
ctx.save();
ctx.globalAlpha = 1;
ctx.translate(canvas.width / 2, canvas.height / 2);
ctx.rotate(Math.PI / 2);
let ratio = canvas.height/canvas.width
ctx.drawImage(image, -canvas.height / 2, -canvas.width / 2, canvas.width/ratio, canvas.width);
ctx.restore();
};
<canvas id="canvas"></canvas>
我不确定你的对角线计算需要什么,所以我只是删除了它和其他不相关的东西......在未来的问题中,如果你能解释你的逻辑,我们可以更好地回应你的方法出错的地方/地方
您可以将相同的逻辑用于其他类似的转换......
这是另一个代码示例:
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var image = new Image();
image.src = "http://i.stack.imgur.com/UFBxY.png";
image.onload = () => {
canvas.height = canvas.width = Math.max(image.naturalWidth, image.naturalHeight);
// original image
ctx.globalAlpha = 0.2;
ctx.drawImage(image, 0, 0);
ctx.rect(0, 0, image.naturalWidth, image.naturalHeight);
ctx.fill()
// rotated image
ctx.save();
ctx.globalAlpha = 1;
ctx.translate(image.naturalHeight / 2, image.naturalWidth / 2);
ctx.rotate(Math.PI / 2);
ctx.drawImage(image, -image.naturalWidth / 2, -image.naturalHeight / 2);
ctx.restore();
};
<canvas id="canvas"></canvas>
推荐阅读
- c# - 我可以将压缩文件从一个 Zip 文件复制到另一个而不解压缩和重新压缩它吗?
- python - 为什么在函数中使用print语句时赋值语句产生值而使用return时没有值?
- scala - For循环在Scala中选择一列
- database - 尝试将数据插入/更新/删除到 informix 时,ODBC 错误没有足够的空间用于解析器堆栈
- php - 来自控制器的 Laravel 过滤器数据库
- rust - 为什么没有为包装 FnMut 的`std::cell::RefMut<'_, [..]>` 实现 DerefMut?
- c# - ExcelDataReader 不读取带有逗号的浮点数,例如“123,45”(而是读取“123.45”)
- angular - 如何根据下拉列表参数生成不同的对象并创建专用网页?
- java - 使用 JLabel 添加背景图像
- oracle - APEX ORACLE 如何从链接运行 SQL 过程