Canvas で遊んでみる 2
画像を回転させる Bookmarklet を作ってみた。
javascript:(function(){var l=location.href;location.href='data:text\/html;charset=utf8,<html><head><script type="text\/javascript">function draw(){var canvas=document.getElementById("canvas");var img=document.createElement("img");img.src=\"'+l+'\";canvas.setAttribute("width",img.height);canvas.setAttribute("height", img.width);var ctx=canvas.getContext("2d");ctx.rotate(90*Math.PI/180);ctx.translate(0,-1*img.height);ctx.drawImage(img,0,0)}<\/script><\/head><body onload="draw()"><canvas id="canvas"><\/canvas><\/body><\/html>'})();
時計回りに90度回転させる ブックマークレット。 他の度数にする場合はさらに座標系をいじらないといけない。
javascript の部分を 抜き出してみる
function draw(){ var canvas = document.getElementById("canvas"); var img = document.createElement("img"); img.src = "画像URL"; canvas.setAttribute("width", img.height); canvas.setAttribute("height", img.width); var ctx = canvas.getContext("2d"); ctx.rotate(90 * Math.PI / 180); ctx.translate(0, -1 * img.height); ctx.drawImage(img, 0, 0) }
ポイント
rotate で回転させるわけだがcanvas要素の左下左上を中心に回るので 回転分を考慮して translate で座標系を移動させないといけない。
180 度だと
canvas.setAttribute("width", img.width); canvas.setAttribute("height", img.height); var ctx=canvas.getContext("2d"); ctx.rotate(Math.PI); ctx.translate( -1 * img.width, -1 * img.height); ctx.drawImage(img, 0, 0)
でいけると思う。
追記
重大な勘違いをしていた。 rotate させると座標も回転すことに気づいた。 だから rotate させる前に translate させといた方が混乱せずにすむ。
一般
どんな角度にも対応できるようにしようとしてるんだけど,頭がこんがらがって求めたいものが出ない。
とりあえず 0 〜 90 度 まではできたんだけどそれより上ができない。ダメだ。