JavaScriptを使って、画素の処理と画像の取り出し
こんにちはあっくんです。JavaScriptで色をgradationする表現に感動しています。数値で、管理できるので色々コピーしやすそうです。
今回はJavaScriptを使って、画素の処理と画像の取り出しをやっていきましょー。
Canvasを使うと、画素を取り出して1ドットずつRGBA(赤、緑、青、透明)の値を得たり、書き換えたりできます。また、Data URLという方法で、画像をPNGやJPEGとしてとりだして、imgタグに表示したり、画像としてダウンロードしたりできます。
 ただし、ローカルで実行する時には、制限があります。クロスオリジン制約によって、画素の取り出しや、画像の取り出しはエラーになります。
クロスオリジン制約とは、JavaScript で自由にやりとりできるところは、その JavaScript をとってきたところと同一の場所だけに制限します。
画素の処理
2dコンテクストからは、ImageDataオブジェクトを取り出せます。ImageDataオブジェクトを使えば、画素単位での処理ができます。
ImageDataオブジェクトのプロパティ
.width
横幅。
.height
高さ。
.data
RGBAのデータが配列。
ImageDataオブをあつかうメソッド
.getImageData(sx, sy, sw, sh)
座標sx, sy, 横幅sw, 高さshの領域を、ImageDataとして取り出します。
.putImageData(i, dx, dy)
ImageDataオブジェクトiを、座標dx,dyに描画。
.putImageData(i, dx, dy, sx, sy, sw, sh)
ImageDataオブジェクトiの、座標sx,sy,横幅sw,高さshの領域を、座標dx, dyn描画。
例、グラデーションの描画をしたあと、真ん中部分を取り出して、RGBを入れ替えます。
 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <style>
        canvas {
            background: url(./img/スプーンアイコン.png);
            background-size: 1%;
            border: solid 1px #888;
        }
    </style>
</head>
<body>
    <canvas id="canvas" width="400" height="300"></canvas>
    <script>
        // Canvasを選択して2次元コンテクストを取り出す
        const canvas = document.querySelector("#canvas");
        const context = canvas.getContext("2d");
        const w = canvas.width;
        const h = canvas.height;
        // 図形を描く
        for (let i = 0; i < h; i++) {
            // 色の作成と設定
            const gradation = Math.trunc((255 * i) / h);
            const r = gradation;
            const g = 255 - gradation;
            const b = 255;
            context.fillStyle = `rgb(${r},${g},${b})`;
            // 横1ラインずつ塗りつぶし
            context.fillRect(i / 8, i, w - h / 8, 1);
        }
        // ImageDataオブジェクトを取り出す
        const imgDt = context.getImageData(50, 100, 300, 100);
        const data = imgDt.data;
        // 画素に対して処理をする
        for (let i = 0; i < data.length; i += 4) {
            // RGBAを取り出す
            const r = data[i + 0];
            const g = data[i + 1];
            const b = data[i + 2];
            const a = data[i + 3];
            // // RGBAを入れ替える
            data[i + 0] = b;
            data[i + 1] = r;
            data[i + 2] = g;
        }
        // ImageDataオブジェクト描画する
        context.putImageData(imgDt, 50, 100);
    </script>
</body>
</html>Code language: HTML, XML (xml)Data URLの取り出し
Canvasからは、Data URLと呼ばれる形式のPNG画像やJPEG画像を取り出せます。
Data URLは、URLとしても使える文字列形式のデータです。また、ダウンロードさせると通常のバイナリ形式の画像としてローカルに保存できます。
バイナリ形式とは、コンピュータが直接的に処理するために2進数で表現されます。
Data URLを取り出すメソッド
.toDataURL([t, e])
画像の種類t, エンコードオプションeで、Data URLを得る。引数をしないときはpng形式。
例、Canvasに画像を描画したあと、画像をData URLで取り出して、imgタグでWebページに挿入します。
 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <style>
        canvas {
            background: url(./img/スプーンアイコン.png);
            background-size: 1%;
            border: solid 1px #888;
        }
    </style>
</head>
<body>
    <canvas id="canvas" width="400" height="180"></canvas>
    <script>
        // Canvasを選択して、2次元コンテクストを取り出す
        const canvas = document.querySelector("#canvas");
        const context = canvas.getContext("2d");
        const w = canvas.width;
        const h = canvas.height;
        // 図形を描く
        for (let i = 0; i < h; i++) {
            // 色の作成と指定
            const gradation = Math.trunc((255 * i) / h);
            const r = gradation;
            const g = 255 - gradation;
            const b = 255;
            context.fillStyle = `rgb(${r},${g},${b})`;
            // 横1ラインずつ塗りつぶし
            context.fillRect(i / 2, i, w - h / 2, 1);
        }
        // Data URLを得る
        const dtUrl = canvas.toDataURL();
        console.log(dtUrl);
        // 画像としてWebページに追加
        const elImg = document.createElement("img");
        elImg.setAttribute("src", dtUrl);
        document.querySelector("body").appendChild(elImg);
    </script>
</body>
</html>Code language: HTML, XML (xml)読んでいただいてありがとうございました!
JavaScript完全入門は体系的に学べるのでおすすめです。
 
				