みかづきブログ その3

本ブログは更新を終了しました。通算140万ユーザーの方に観覧頂くことができました。長い間、ありがとうございました。

👆

引越し先はこちらです!

Canvasをつかって画像をぼかす習作

いつもはCSSのfilterをつかってぼかすのですが、 Android4.3以前も対応させようとするとそうもいきません

developer.mozilla.org
Can I use... Support tables for HTML5, CSS3, etc

というわけでCanvasをつかって画像をぼかす習作をつくってみました。
自分と自分の周りのピクセルの平均値を取って己の色を再設定しています。
(ロジックの手を抜いているので左右もつながってしまっています)

DEMO


JavaScript

  (function canvasBlur(win, doc, canvas) {
    var body = doc.body,
        img  = new Image(),
        ctx  = canvas.getContext("2d"),
        imgData, data;
    
    img.onload = function() {
      var WIDTH   = this.width / 4,
          HEIGHT  = this.height / 4,
          LEVEL   = 9,
          posList = [],
          r, g, b, count;

      canvas.width  = WIDTH;
      canvas.height = HEIGHT;
      canvas.style.cssText += "; width: " + WIDTH * 2 + "px; heihgt: " + HEIGHT * 2 + "px;";

      ctx.drawImage(this, 0, 0, WIDTH, HEIGHT);

      imgData = ctx.getImageData(0, 0, WIDTH,  HEIGHT);
      data    = imgData.data;

      for (var i = 0, length = data.length; i < length; i += 4) {
        count   = 0;
        r       = 0;
        g       = 0;
        b       = 0;

        for (var j = 0, jLength = LEVEL * LEVEL; j < jLength; ++j) {
          posList[j] = i + (4 * ((j / LEVEL | 0) - (LEVEL / 2 | 0))) * WIDTH + (4 * (j % LEVEL) - (LEVEL - 1) * 2);
        }

        _blur(posList, length);
      }
        
      ctx.putImageData(imgData, 0, 0);

      function _blur(arr, length) {
        for (var k = 0, kLength = arr.length; k < kLength; ++k) {
          if (0 <= arr[k] && arr[k] < length) {
            ++count;

            r += data[arr[k] + 0];
            g += data[arr[k] + 1];
            b += data[arr[k] + 2];
          }
        }

        data[i + 0] = r / count;
        data[i + 1] = g / count;
        data[i + 2] = b / count;
      }
    };
    
    img.src = "http://jsrun.it/assets/m/8/N/9/m8N9Y.jpeg";
    
  })(this, document, document.getElementById("canvasBlur"));

全員が全員、周りにあわせようにするとぼけぼけになるというのは、画像でも社会でも同じことなのかもしれないですね。