LoginSignup
7
7

More than 5 years have passed since last update.

《JavaScript》画像から取得したデータでCanvasにモザイクを描く方法。

Last updated at Posted at 2017-11-21

canvas 要素に記述した独自データ属性の data-src 属性を参照し、その画像データからモザイクを描くスクリプトです。

モザイクのサイズを変えられるような関数になっています。

Html


<canvas id="canvas" data-src="test.jpg" width="800" height="600"></canvas>

JavaScript


/**
 * canvasのdata-src属性の画像のピクセルデータからモザイクを描画する
 * @param mosaicSize {number}
 */
const mosaicImage = (target, mosaicSize = 20) => {

  let canvas = document.getElementById(target),
      _canvas = document.createElement('canvas');

  if (!canvas || !canvas.getContext) {

    return false;

  }

  /**
   * 画像情報からモザイクを描画する
   */
  const createMosaic = (context, width, height, size, data) => {

    for (let y = 0; y < height; y += size) {

      for (let x = 0; x < width; x += size) {

        /**
         * r,g,b,a の順で格納されている値を取り出す
         */
        let cR = data.data[(y * width + x) * 4],
            cG = data.data[(y * width + x) * 4 + 1],
            cB = data.data[(y * width + x) * 4 + 2];

        context.fillStyle = `rgb(${cR},${cG},${cB})`;
        context.fillRect(x, y, x + size, y + size);

      }

    }

  };

  /**
   * カンバスに描画
   */
  const draw = (_context, imageData, context) => {

    createMosaic(_context, _canvas.width, _canvas.height, mosaicSize, imageData);
    context.drawImage(_canvas, 0, 0);

  };


  const init = () => {

    let context = canvas.getContext('2d');

    /**
     * 画像をセット
     */
    let img = new Image();
    img.src = canvas.getAttribute('data-src');

    /**
     * 画像のロードを待って
     */
    img.onload = () => {

      let _context = _canvas.getContext('2d'),
          imageData;

      /**
       * 画像とカンバスのサイズを合わせる
       */
      _canvas.width = img.width;
      _canvas.height = img.height;

      _context.drawImage(img, 0, 0);

      /**
       * canvasのピクセルデータのオブジェクト
       * 左から右に、 r, g, b, a の順で色情報が格納されている
       */
      imageData = _context.getImageData(0, 0, _canvas.width, _canvas.height);

      draw(_context, imageData, context);

    };

  };
  init();

};

/**
 * 対象のカンバス, モザイクのサイズ
 */
mosaicImage('canvas', 20);

おわります。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7