バイナリ画像をDataURIに変換
2009/09/21(月) 28:07 Javascript親記事へこのエントリーをはてなブックマークに追加

XHRで取得したものをDataURIにする。というのを目指してただけで動いてないはず。
function Baseka(url , callback){
        var parseHTTPHeader=function(responseHeader){
            var headers=responseHeader.split("\n");
            var len=headers.length;
            var parsing=[];
            for(var i=0;i<len;i++){
                if(/^$/.test(headers[i])){
                }else if(/^[\x09\x20]/.test(headers[i])){
                    if(parsing.length==0){
                        throw "SyntaxError:HTTPHeader (first line) "+headers[i];
                    }
                    parsing[parsing.length-1]+="\n"+headers[i];
                }else{
                    parsing.push(headers[i]);
                }
            }
            var len=parsing.length;
            var parsed={};
            for(var i=0;i<len;i++){
                var pair=parsing[i].split(": ",2);
                if(pair.length!=2){
                    throw "SyntaxError:HTTPHeader (format) "+parsing[i];
                }
                if(pair[0] in parsed){
                    throw "SyntaxError:HTTPHeader (repetition) "+pair[0];
                }
                parsed[pair[0]]=pair[1];
            }
            return parsed;
        }

        var loadDataMethod=function(res){
            var headers=parseHTTPHeader(res.responseHeaders);
            if(res.status!=200){
                throw "RequestError"+
                    ":status="+res.status+
                    ":statusText="+res.statusText+
                    ":responseHeaders="+res.responseHeaders;
            }
            var contentType=("Content-Type" in headers)?
                headers["Content-Type"]:
                "application/octet−stream";
            var dataScheme="data:"+contentType+
                ";base64,"+btoa(
                    res.responseText.replace(
                        /[\u0100-\uffff]/g,
                        function(c){
                            return String.fromCharCode(c.charCodeAt(0)&0xff);
                        }
                    )
                );
            data.callback(dataScheme);
        }

        var getData=function(url){
        		console.log(url)
            data.url=url;
            GM_xmlhttpRequest(
                {
                    "method":"GET",
                    "url":data.url,
                    "onload":loadDataMethod,
                    "onerror":loadDataMethod,
                    "overrideMimeType":"text/plain; charset=x-user-defined"
                }
            );
        }

        var data={};

        var getFileByDataScheme=function(url,callback){
            data.callback=callback;
            getData(url);
        }
        
         var handler=function(url,callback){
             (function(){
                 getFileByDataScheme(url,callback);
             })();
         }
         handler(url,callback); 
 }
画像化してみる
function Baseka(url , callback){

        var parseHTTPHeader=function(responseHeader){
            var headers=responseHeader.split("\n");
            var len=headers.length;
            var parsing=[];
            for(var i=0;i<len;i++){
                if(/^$/.test(headers[i])){
                }else if(/^[\x09\x20]/.test(headers[i])){
                    if(parsing.length==0){
                        throw "SyntaxError:HTTPHeader (first line) "+headers[i];
                    }
                    parsing[parsing.length-1]+="\n"+headers[i];
                }else{
                    parsing.push(headers[i]);
                }
            }
            var len=parsing.length;
            var parsed={};
            for(var i=0;i<len;i++){
                var pair=parsing[i].split(": ",2);
                if(pair.length!=2){
                    throw "SyntaxError:HTTPHeader (format) "+parsing[i];
                }
                if(pair[0] in parsed){
                    throw "SyntaxError:HTTPHeader (repetition) "+pair[0];
                }
                parsed[pair[0]]=pair[1];
            }
            return parsed;
        }

        var loadDataMethod=function(res){
            var headers=parseHTTPHeader(res.responseHeaders);
            if(res.status!=200){
                throw "RequestError"+
                    ":status="+res.status+
                    ":statusText="+res.statusText+
                    ":responseHeaders="+res.responseHeaders;
            }
            var contentType=("Content-Type" in headers)?
                headers["Content-Type"]:
                "application/octet−stream";
            var dataScheme="data:"+contentType+
                ";base64,"+btoa(
                    res.responseText.replace(
                        /[\u0100-\uffff]/g,
                        function(c){
                            return String.fromCharCode(c.charCodeAt(0)&0xff);
                        }
                    )
                );
            getCanvas(dataScheme);
        }

        var getData=function(url){
            console.log(url)
            data.url=url;
            GM_xmlhttpRequest(
                {
                    "method":"GET",
                    "url":data.url,
                    "onload":loadDataMethod,
                    "onerror":loadDataMethod,
                    "overrideMimeType":"text/plain; charset=x-user-defined"
                }
            );
        }

        var data={};

        var getFileByDataScheme=function(url,callback){
            data.callback=callback;
            getData(url);
        }
        
         var handler=function(url,callback){
             (function(){
                 getFileByDataScheme(url,callback);
             })();
         }
         function getCanvas(resScheme){
              //Canvas要素を準備
              var canvas=document.createElement("canvas");
              //画像オブジェクトの準備
              var img=new Image();
              img.src=resScheme;
               //画像の描画
              var cx=canvas.getContext("2d");
              cx.drawImage(img,0,0);

              //画像データの取得とボディへの挿入
              var dataScheme=canvas.toDataURL("image/png");
              data.callback(dataScheme);
            }
         handler(url,callback); 
 }
XMLHttpRequestでファイルをDataSchemeで取得する実験 その3 (Kanasansoft Web Lab.)
http://www.kanasansoft.com/weblab/2009/04/xmlhttprequestdatascheme_3.html


画像をDataURIに変換するブックマークレット
javascript: (function () {
    var elem = document.images[0];
    var canvas = document.createElement('canvas');
    canvas.width = elem.width;
    canvas.height = elem.height;
    elem.parentNode.insertBefore(canvas, elem);
    var ctx = canvas.getContext("2d");
    ctx.drawImage(elem, 0, 0);
    elem.parentNode.replaceChild(document.createTextNode(canvas.toDataURL("image/png")), elem);
    canvas.parentNode.removeChild(canvas);
})();

名前:  非公開コメント   

  • TB-URL  http://efcl.info/adiary/011/tb/