使用jQuery缓存base64中的图像文件

Cache image files in base64 with jQuery

本文关键字:图像 文件 base64 jQuery 缓存 使用      更新时间:2023-09-26

我正试图为我正在使用的图像文件编写缓存。我将使用这个图像文件来使用画布提取图像的部分。但这似乎行不通。如果我第一次调用url(空缓存)的函数getBase64OfSubImage返回错误的子图像(空png)。但这似乎只是偶尔发生。当我第二次运行相同的命令时,它返回正确的子图像。

var backgroundImageURLs = Object();
function checkBase64OfImage(url){
    var dfd = $.Deferred();
    if(backgroundImageURLs[url] !== undefined){
        dfd.resolve();
    }
    else {
        var req = new XMLHttpRequest();
        req.overrideMimeType('text/plain; charset=x-user-defined');
        req.open('GET', url, true);
        req.responseType = 'arraybuffer';
        req.onload = function() {
            buffer = req.mozResponseArrayBuffer || req.response;
            type = req.getResponseHeader('Content-Type');
            var blob = new Blob([buffer], {type: type});
            var fr = new FileReader();
            fr.onload = function() {
                backgroundImageURLs[url] = window.btoa(fr.result);
                dfd.resolve();
            };
            fr.readAsBinaryString(blob);
        };
        req.send(null);
    }
    return dfd.promise();
}
function getBase64OfSubImage(url, pos, size){
    if(backgroundImageURLs[url] !== undefined){
        var base64_img = "data:image/png;base64,"+backgroundImageURLs[url];
        var tmp_img = new Image();
        tmp_img.setAttribute("src", base64_img);
        var canvas = $('<canvas/>')[0];
        canvas.width = size[0];
        canvas.height = size[1];
        canvas.getContext('2d').drawImage(tmp_img, pos[0], pos[1], size[0], size[1], 0, 0, size[0], size[1]);
        return canvas.toDataURL().split(",")[1]; //Get Base64-representation of partial image
    }
    return false;
}

你知道为什么它不能正常工作吗?我使用jQuery Deferred/When来确保图像完全加载到缓存中:

$.when(checkBase64OfImage(background_url)).then(function(){
    img_b64 = getBase64OfSubImage(background_url, background_position, size);
}

自己找到解决办法。当试图处理它时,图像没有完全加载(在getBase64OfSubImage中),尽管它是一个Base64-String。

这个解决方案非常有效:

function getBase64OfSubImage(){
    if(backgroundImageURLs[url] !== undefined){
        var base64_img = "data:image/png;base64,"+backgroundImageURLs[url];
        var tmp_img = new Image();
        tmp_img.onload = function(){
            var canvas = $('<canvas/>')[0];
            canvas.width = size[0];
            canvas.height = size[1];
            canvas.getContext('2d').drawImage(this, pos[0], pos[1], size[0], size[1], 0, 0, size[0], size[1]);
            finish(canvas.toDataURL().split(",")[1]); //Get Base64-representation of partial image
        };
        tmp_img.setAttribute("src", base64_img);
    }
    else {
        checkBase64OfImage();
    }
};