スタートページJavascript画像CANVAS

drawImageZPR 画像をズームや回転をしてCANVASに表示


drawImageZPR(canvas名, 画像名, 画像左上x,画像左上y, {オプション});
 canvas名         // HTMLでサイズも定義  画像名  画像左上x,画像左上y    // 画像の左上端(位置調整で変更)が CANVAS に表示する位置  オプションと省略値
  位置調整 : "左上",   // 画像のこの位置を、画像左上x,画像左上yに設定する
  画像幅 : 0, 画像高 : 0, // 指定すると画像をズームして表示。0のときはズームしない
  回転位置 : "左上",   // 回転するときの画像の位置
  回転角度 : 0      // 度分法で反時計回りで指定。0のとき回転しない。
   (位置調整と回転位置 "中央", "左上", "左下", "右上", "右下")

<canvas id ="画像canvas" width="400" height="300"></canvas>



function drawImageZPR(canvas名, 画像名, 画像左上x,画像左上y, 
                 { 
                  位置調整 = "左上",
                  画像幅 = 0, 画像高 = 0,
                  回転位置 = "左上",
                  回転角度 = 0
                 }
         ) {
    var canvas = document.getElementById(canvas名);
    var ctx = canvas.getContext("2d");
    ctx.fillStyle = 'silver';
    ctx.fillRect(0,0,canvas.width, canvas.height);

    var 画像 = new Image();
    画像.onload = function() {
        var 元画像幅 = 画像.width;
        var 元画像高 = 画像.height;
        // ================================ 処理の確認
        // ================ ズーム処理の有無
        if (画像幅 == 0) { // 画像幅, 画像高を与えないとき
            var ズーム処理 = false;
            画像幅 = 元画像幅;
            画像高 = 元画像高;
        }
        else {
            var ズーム処理 = true;
        }
        // ================ 位置調整の有無
        if (位置調整 == "左上") {
            var 位置調整処理 = false;
            var 位置調整x = 0;    var 位置調整y = 0;
        }
        else {
            位置調整処理 = true;
            if      (位置調整 == "中央") { 位置調整x = 画像幅/2; 位置調整y = 画像高/2; }
            else if (位置調整 == "左下") { 位置調整x = 0;        位置調整y = 画像高; }
            else if (位置調整 == "右上") { 位置調整x = 画像幅;   位置調整y = 0; }
            else if (位置調整 == "右下") { 位置調整x = 画像幅;   位置調整y = 画像高; }
        }
        // ================ 回転処理の有無
        if (回転角度 == 0) var 回転処理 = false;
        else {
            回転処理 = true;
            var 角度 = -回転角度 * Math.PI/180; // ラジアン、反時計回りに変換
            // 回転位置
            if      (回転位置 == "左上") {var 回転位置x = 0;    var 回転位置y = 0; }
            else if (回転位置 == "中央") { 回転位置x = 画像幅/2; 回転位置y = 画像高/2; }
            else if (回転位置 == "左下") { 回転位置x = 0;        回転位置y = 画像高; }
            else if (回転位置 == "右下") { 回転位置x = 画像幅;   回転位置y = 画像高; }
        }
        // translateやrotateを使う前の標準状態を保存
        ctx.save();

        // ============================= 画像表示
        // ================ ズーム処理後の画像表示
        if ( (!位置調整処理) && (!回転処理) ) {
            ctx.drawImage(画像, 0,0, 元画像幅, 元画像高, 画像左上x,画像左上y, 画像幅, 画像高);
        }
        if ( (!位置調整処理) && (!回転処理) ) {
            ctx.restore();
            return;
        }
        // ================ 位置調整処理後の画像表示
        ctx.translate(画像左上x - 位置調整x, 画像左上y - 位置調整y);  // 原点を画像の中心位置に
        if (!回転処理) {
            ctx.drawImage(画像, 0,0, 画像幅, 画像高);
        }
        if (!回転処理) {
            ctx.restore();
            return;
        }
        // ================ 回転処理後の画像表示
        ctx.translate( 回転位置x, 回転位置y );  // 原点を画像の中央にする
        ctx.rotate(角度);          // 回転中心に30°時計回りに回転
        ctx.translate( -回転位置x, -回転位置y ) ;
        ctx.drawImage(画像, 0,0, 画像幅, 画像高);
        ctx.restore();
    }
    画像.src = 画像名;
}