我正在尝试为我正在使用的图像文件编写缓存。我将使用此图像文件使用画布提取图像的一部分。
但它似乎不能正常工作。如果我第一次调用该函数的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);
}
答案 0 :(得分:1)
我自己找到了解决方案。尝试处理图像时(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();
}
};