ノヴム・オペラヌム

画像をモノクロに変換するブックマークレット

,

画像を開いた後でブックマークレットを実行すると画像がモノクロになります。ただし、変換した画像を保存したりすることはできません。

これが
モノクロ変換前
こうなる
モノクロ変換後

ブックマークレット

javascript:(function(){if(window.location.href.match(/^.*\.(jpe?g|bmp|gif|png)$/i)){var ie=document.getElementsByTagName('img')[0];var io=new Image();io.src=ie.src;var canvas=document.createElement('canvas');canvas.width=io.width;canvas.height=io.height;var ctx=canvas.getContext('2d');ctx.drawImage(io,0,0,io.width,io.height);ie.parentNode.replaceChild(canvas,ie);var gctx=canvas.getContext('opera-2dgame');gctx.lockCanvasUpdates(true);var ih=canvas.height;var iw=canvas.width;for(var y=ih;y--;){for(var x=iw;x--;){var color=parseInt(gctx.getPixel(x,y).substr(1),16);var r=color>>16;var g=color>>8&255;var b=color&255;var c=0.298912*r+0.586611*g+0.114478*b;gctx.setPixel(x,y,'rgb('+c+','+c+','+c+')');}}gctx.lockCanvasUpdates(false);gctx.updateCanvas();}})();

整形したソースコード

(function () {
  if (window.location.href.match(/^.*\.(jpe?g|bmp|gif|png)$/i)) {
    var ie = document.getElementsByTagName('img')[0];
    var io = new Image();

    io.src = ie.src;

    var canvas = document.createElement('canvas');

    canvas.width = io.width;
    canvas.height = io.height;

    var ctx = canvas.getContext('2d');

    ctx.drawImage(io, 0, 0, io.width, io.height);
    ie.parentNode.replaceChild(canvas, ie);

    var gctx = canvas.getContext('opera-2dgame');

    gctx.lockCanvasUpdates(true);

    var ih = canvas.height;
    var iw = canvas.width;

    for (var y = ih; y--;){
      for (var x = iw; x--;){
        var color = parseInt(gctx.getPixel(x, y).substr(1), 16);
        var r = color >> 16;
        var g = color >> 8 & 255;
        var b = color & 255;
        var c = 0.298912 * r + 0.586611 * g + 0.114478 * b;

        gctx.setPixel(x, y, 'rgb(' + c + ',' + c + ',' + c + ')');
      }
    }

    gctx.lockCanvasUpdates(false);
    gctx.updateCanvas();
  }
}) ();

補足

  • 画像をcanvas要素に突っ込み、ピクセル単位でグレースケール変換しています。
  • opera-2dgameコンテキストを利用しているため、Opera以外では動きません。
  • 滅茶苦茶重いです。スペックが低い場合や大きい画像を変換する場合は数分から数十分単位で時間がかかります。
  • 最初はページに存在する全ての画像をグレースケール変換するUserJSを書いていたんですが、Operaが落ちまくるのでやめました。
  • 画像一つだけでも、環境によってはOperaがクラッシュする可能性があります。
  • まあ、お遊びというか、Operaならこんなこともできるんだぜという事で。

参考にした

Weekly Builds (2007-03-17) Weekly Builds (2007-03-24)

Comments

Dan Alexandrudantesoft Thursday, March 22, 2007 5:26:11 PM

Sepia = Red + 20%, Blue - 15%
gctx.setPixel(x,y,'rgb('+1.2*c+','+c+','+0.85*c+')')


Press * (zoom 100% = redraw) while script is running to see progress.

Satoru WatanabeWatanabe Friday, March 23, 2007 12:52:16 AM

Originally posted by dantesoft:

Sepia = Red + 20%, Blue - 15%



Awesome! yes