遮眼帯ブックマークレット

  • /*
     * @title 遮眼帯ブックマークレット
     * @description 顔画像に遮眼帯をつけます。
     * @include http://*
     * @license MIT License
     * @require jQuery
     */
    (function() {
    var proxiedAjax = function(options) {
        var merged_options = {};
        var url = options["url"];
        if (typeof options.data != "undefined") {
            url = url.replace(/\?|$/, function(g) {
                return "?" + $.param(options.data);
            });
        }
        $.extend(merged_options,
            options,
            {
                url: "http://query.yahooapis.com/v1/public/yql",
                data: {
                    format: "json",
                    q: "select * from xml where url='"
                       + url.replace(/'/g, "''") + "'"
                },
                dataType: "jsonp",
                success: function(data) {
                    options["success"](data.query.results);
                }
            }
        );
        return $.ajax(merged_options);
    };
    
    var makeInt = function(x) {
        retval = {}
        for (var i in x) {
            if (x.hasOwnProperty(i)) {
                var v = x[i];
                if (typeof v == "string" || v instanceof String)
                    v = parseInt(v);
                else
                    v = makeInt(v);
                retval[i] = v;
            }
        }
        return retval;
    };
    
    var main = function() {
        $("img").each(function(n, img) {
            if (img.src.indexOf("gif") >= 0 || img.width < 64 || img.height < 64)
                return;
            proxiedAjax({
                url: "http://detectface.com/api/detect",
                data: { url: img.src },
                success: function (data) {
                    if (!data || !data.faces.face)
                        return;
                    var faces = data.faces.face instanceof Array ?
                                data.faces.face: [data.faces.face];
                    var canvas = $("<canvas/>")
                        .css({
                            width: img.width + "px",
                            height: img.height + "px"
                        })
                        .attr({ width: img.width, height: img.height });
                    var ctx = canvas.get()[0].getContext("2d");
                    $.each(faces, function(n, face) {
                        var l = makeInt(face["left-eye"]), r = makeInt(face["right-eye"]);
                        var vx = l.x - r.x, vy = l.y - r.y;
                        var distance = Math.sqrt(vx * vx + vy * vy);
                        var nvx = vx / distance, nvy = vy / distance;
                        ctx.drawImage(img, 0, 0);
                        ctx.strokeStyle = "#000";
                        ctx.lineWidth = distance / 3.5;
                        ctx.lineCap = "butt";
                        ctx.beginPath();
                        var d = distance / 4;
                        ctx.moveTo(l.x + nvx * d, l.y + nvy * d);
                        ctx.lineTo(r.x - nvx * d, r.y - nvy * d);
                        ctx.stroke();
                    });
                    canvas.appendTo(img.parentNode);
                    $(img).remove();
                }
            });
        });
    };
    
    main();
    })();
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。

History

  1. 2010/07/01 11:07:59 - 2010-07-01
  2. 2010/05/26 04:45:48 - 2010-05-26