我有這個簡單的canvas
網頁,它允許用戶通過使用HTML input type file
從相機上傳照片。這個想法是讓用戶在他們的圖像上自由繪畫。但是,我有一個問題。HTML Canvas在變換和旋轉後重置繪圖點
在某些設備上,來自相機的圖像以錯誤的方向繪製到畫布上,所以我必須爲用戶提供一個按鈕來旋轉其圖像以獲取正確方向的圖形。
問題是,在畫布已被轉換並旋轉以獲得正確的方向之後,繪圖座標看起來有些偏離。例如,如果我繪製直線水平線,則在圖像旋轉一次後,我會得到垂直線。我認爲問題在於畫布方向改變的事實。
那麼如何在圖像被轉換和旋轉後如何校正繪圖座標?我的代碼如下..
window.onload = init;
var canvas, ctx, file, fileURL;
var mousePressed = false;
var lastX, lastY;
function init(){
\t canvas = document.getElementById('myCanvas')
\t ctx = canvas.getContext('2d')
\t canvas.addEventListener('mousedown', touchstartHandler, false)
\t canvas.addEventListener('mousemove', touchmoveHandler, false)
\t canvas.addEventListener('mouseup', touchendHandler, false)
\t canvas.addEventListener('mouseleave', touchcancelHandler, false)
}
function touchstartHandler(e){
\t e.preventDefault()
\t mousePressed = true;
\t Draw(e.pageX - this.offsetLeft, e.pageY - this.offsetTop, false);
}
function touchmoveHandler(e){
\t e.preventDefault()
\t if (mousePressed) {
\t Draw(e.pageX - this.offsetLeft, e.pageY - this.offsetTop, true);
\t }
}
function touchendHandler(e){
\t e.preventDefault()
\t if (mousePressed) {
\t mousePressed = false;
\t }
}
function touchcancelHandler(e){
\t e.preventDefault()
\t if (mousePressed) {
\t mousePressed = false;
\t }
}
function Draw(x, y, isDown) {
if (isDown) {
ctx.beginPath();
ctx.strokeStyle = "blue";
ctx.lineWidth = 12;
ctx.lineJoin = "round";
ctx.moveTo(lastX, lastY);
ctx.lineTo(x, y);
ctx.closePath();
ctx.stroke();
}
lastX = x;
lastY = y;
}
<!DOCTYPE html>
<html>
<head>
\t <title>Portrait</title>
</head>
<body>
\t <canvas id="myCanvas"></canvas><br/>
\t <input type="file" onchange="fileUpload(this.files)" id="file-input" capture="camera"><br/><br/>
\t <button onclick="rotate()">Rotate</button>
\t <script>
\t \t var file, canvas, ctx, image, fileURL;
\t \t function fileUpload(files){
\t \t \t file = files[0]
\t \t \t fileURL = URL.createObjectURL(file)
\t \t \t canvas = document.getElementById('myCanvas')
\t \t \t canvas.style.backgroundColor = "blue"
\t \t \t ctx = canvas.getContext('2d')
\t \t \t image = new Image()
\t \t \t
image.onload = function() {
canvas.width = 500
canvas.height = (500*this.height)/this.width
ctx.drawImage(image,0,0,canvas.width,canvas.height)
ctx.save();
}
\t \t \t image.src = fileURL
\t \t \t }
\t \t \t function rotate(){
\t \t \t \t ctx.clearRect(0,0,canvas.width,canvas.height)
\t \t \t \t ctx.translate(canvas.width/2, canvas.height/2)
\t \t \t \t ctx.rotate(90*Math.PI/180)
\t \t \t \t ctx.translate(-canvas.width/2, -canvas.height/2)
\t \t \t \t ctx.drawImage(image,0,0,canvas.width,canvas.height)
\t \t \t }
\t </script>
</body>
</html>
我以前試過這個選項,它工作,但問題是,我只能旋轉一次,旋轉似乎停止工作一次後。你爲什麼一次停止旋轉? – notQ
我還有一個問題。例如,圖像旋轉一次後,畫布左右兩側會有一些沒有圖像繪製的空白區域。現在我想調整畫布大小,使畫布大小與圖像相同,但我不知道如何在圖像旋轉和轉換後獲取圖像的寬度和高度。看起來圖像的寬度和高度都發生了變化。 – notQ
檢查編輯的答案,我沒有看到任何空白。 *(這是一個差異。問題btw,這裏不能回答)* –