gpt4 book ai didi

javascript - 在 Canvas 内旋转图像时遇到一些问题

转载 作者:行者123 更新时间:2023-11-30 12:48:20 26 4
gpt4 key购买 nike

问题:当我旋转添加的图像时,图像没有像我希望的那样居中。我在 Canvas 内的图片上方不断出现白色区域。

尝试使用 16:9 比例的图像,旋转后您会看到我的问题。这将用于移动设备,因此图片的宽度最大为 640。

Here is a fiddle当前代码:

HTML:

<div id="files">
<input type="file" id="imageLoader" name="imageLoader" />
</div>
<canvas id="imageCanvas"></canvas>
<canvas id="preview"></canvas>
<input type="button" id="saveButton" value="Save" />
<div id="rotate">
<button type="button" id="rotateLeft">Rotate -90°</button>
<button type="button" id="rotateRight">Rotate 90°</button>
</div>

JS:

 var imageLoader = document.getElementById('imageLoader');
imageLoader.addEventListener('change', handleImage, false);
var image = "";
var canvas = document.getElementById('imageCanvas');
var ctx = canvas.getContext("2d");
var fileName = "";
var angleInDegrees = 0;
function handleImage(e) {
var reader = new FileReader();
reader.onload = function(event) {
var img = new Image();
img.onload = function() {
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0,0);
fileName = img.name;
image = img;
};
img.src = event.target.result;
};
reader.readAsDataURL(e.target.files[0]);
}

function drawRotated(degrees) {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.save();
ctx.translate(canvas.width / 2, canvas.height / 2);
ctx.rotate(degrees * Math.PI / 180);
ctx.drawImage(image, -image.width / 2, -image.width / 2);
ctx.restore();
}

$("#rotateRight").click(function () {
angleInDegrees += 90;
drawRotated(angleInDegrees);
});

$("#rotateLeft").click(function () {
angleInDegrees -= 90;
drawRotated(angleInDegrees);
});

jsfiddle.net/dJ5BH

这是我的新 fiddle :) 如果我希望它的最大宽度为 640 怎么办?

最佳答案

你的 drawImage 中有错别字:

ctx.drawImage(image, -image.width / 2, -image.height / 2);

除非您的图像始终是方形的,否则您必须调整 Canvas 大小以允许旋转后的图像适合。

关于如何调整 Canvas 大小的演示:http://jsfiddle.net/m1erickson/3E99A/

如果您不想更改 Canvas 大小,您的图像将被裁剪。此外,如果图像是横向的,则必须在 drawimage 中翻转宽度/高度:

// flip width/height when the image is in landscape orientation

ctx.drawImage(image, -image.height/2, -image.width/2);

关于如何调整 Canvas 大小的代码:

<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<style>
#canvas{
border: 1px solid green;
}
</style>
<script>
$(function(){
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var imgWidth=200;
var imgHeight=300;
var size={width:imgWidth, height:imgHeight};
var rotation=0;
var deg2Rad=Math.PI/180;
var count1=0;
var count2=0;

var img=new Image();
img.onload=function(){
imgWidth=img.width;
imgHeight=img.height;
size={width:imgWidth, height:imgHeight};
draw();
}
img.src="https://dl.dropboxusercontent.com/u/139992952/stackoverflow/card.png";

function draw(){
canvas.width=size.width;
canvas.height=size.height;

// calculate the centerpoint of the canvas
var cx=canvas.width/2;
var cy=canvas.height/2;
var info=document.getElementById("info");
info.innerHTML="canvas size: "+(count1++)+": "+cx+" / "+cy;

// draw the rect in the center of the newly sized canvas
ctx.clearRect(0,0,canvas.width,canvas.height);
ctx.fillStyle="rgba(216,216,150,1.0)";
ctx.translate(cx,cy);
ctx.rotate(rotation * deg2Rad);
ctx.drawImage(img,-imgWidth/2,-imgHeight/2);
}

document.getElementById("rotate").addEventListener("click", resizeClicked, false);

function resizeClicked(e){
rotation+=30;
newSize(imgWidth,imgHeight,rotation);
draw();
}

function newSize(w,h,a){
var rads=a*Math.PI/180;
var c = Math.abs(Math.cos(rads));
var s = Math.abs(Math.sin(rads));
size.width = h * s + w * c;
size.height = h * c + w * s ;
}

}); // end onload
</script>
</head>
<body>
<button id="rotate">Rotate with resize</button>
<p id=info></p>
<canvas id="canvas" width=400 height=400></canvas>
</body>
</html>

关于javascript - 在 Canvas 内旋转图像时遇到一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21834275/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com