【发布时间】:2018-10-23 05:30:42
【问题描述】:
我正在尝试旋转 HTML canvas 中的图像。旋转确实有效,但是,每次旋转时,图像的角落都会被剪掉/剪掉。这是错误的,因为整个上传的图像在旋转后应该是完整的。
一些重要的细节:
- 在我的特定用例中,我无法访问图像数据本身。因此,用户上传的图像将在 HTML 画布上进行处理和绘制。我只能访问 HTML 画布元素,而不是上传的图像本身。这就是系统的工作原理。
- 画布宽度和高度应与上传图片的宽度和高度完全相同
- 画布本身应保持其尺寸且不应旋转,仅应旋转其中的图像。
- 无 CSS,只能使用 JavaScript 归档,因为旋转后的画布图像将上传到服务器。
所以这里的问题是,每次我想将图像旋转 45 度时,HTML 画布内的图像角都会被剪掉/剪掉。显然这是不正确的,因为应该旋转整个图像。我不知道我做错了什么,所以也许有人可以帮助我进一步?
https://jsfiddle.net/d5zurxq2/
<label>Image File:</label><br/>
<input type="file" id="imageLoader" name="imageLoader"/>
<canvas id="imageCanvas" width=250 height=250></canvas>
<br /><br /><br />
<button type="button" id="rotateLeft">Rotate 45 degrees left</button>
#imageCanvas {
width: 350px;
height: 250px;
background-color: rgba(158, 167, 184, 0.2)
}
var imageLoader = document.getElementById('imageLoader');
imageLoader.addEventListener('change', handleImage, false);
var canvas = document.getElementById('imageCanvas');
var ctx = canvas.getContext("2d");
function handleImage(e){
var reader = new FileReader();
reader.onload = function(e) {
var preview = document.createElement('img');
preview.onload = function()
{
canvas.width = preview.width;
canvas.height = preview.height;
canvas.getContext('2d').drawImage(preview, 0, 0);
};
preview.src = reader.result;
};
reader.readAsDataURL(e.target.files[0]);
}
document.getElementById('rotateLeft').addEventListener('click', rotateImage,
false);
function rotateImage() {
var w = ctx.canvas.width;
var h = ctx.canvas.height;
var ww = w / 2;
var hh = h / 2;
ctx.save();
ctx.globalCompositeOperation = "copy";
ctx.translate(ww, hh);
ctx.rotate((Math.PI / 180) * 45);
ctx.drawImage(canvas, -canvas.width/2, -canvas.height/2);
ctx.restore();
}
【问题讨论】:
标签: javascript canvas rotation