【发布时间】:2013-05-13 13:25:03
【问题描述】:
我遇到的问题是,当页面加载时,有时会显示所有图像,有时只显示 2 张图像,有时会显示全部。我不知道为什么会这样。
有什么想法吗?
$('#banners .box img').each(function(index){
var randval = (index+1)*100;
var _this = $(this)
setTimeout(function(){
_this.attr('id' , 'banner' + index);
to_canvas('banner' + index, 300, 223);
}, randval)
});
to_canvas 函数:
function to_canvas(im,w,h){
var canvas;
var imageBottom;
var im_w = w;
var im_h = h;
var imgData;
var pix;
var pixcount = 0;
var paintrow = 0;
var multiplyColor = [70, 116, 145];
var x_offset = Math.floor(($('#'+im).attr('width') - im_w)/2);
var y_offset = Math.floor(($('#'+im).attr('height') - im_h)/2);
imageBottom = document.getElementById(im);
canvas = document.createElement('canvas');
canvas.width = im_w;
canvas.height = im_h;
imageBottom.parentNode.insertBefore(canvas, imageBottom);
ctx = canvas.getContext('2d');
ctx.drawImage(imageBottom, -x_offset , -y_offset);
imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
pix = imgData.data;
for (var i = 0 ; i < pix.length; i += 4) {
if(pixcount > im_w - (im_h - paintrow) ){
pix[i ] = multiply(multiplyColor[0], pix[i ]);
pix[i+1] = multiply(multiplyColor[1], pix[i+1]);
pix[i+2] = multiply(multiplyColor[2], pix[i+2]);
}
if(pixcount < im_w-1){
pixcount++;
}else{
paintrow++;
pixcount = 0;
}
}
ctx.putImageData(imgData, 0, 0);
$('#'+im).remove();
}
function multiply(topValue, bottomValue){
return topValue * bottomValue / 255;
}
我正在使用画布功能添加具有乘法效果的三角形(如 Photoshop)。
【问题讨论】:
-
很遗憾,我没有给您答案,但您是否尝试过监控您的网站流量以查看图像是否被调用?在 Firebug 中,“NET”选项卡将向您显示页面加载时的所有流量 - 您将能够查看图像是否正在被调用,或者正在加载(或失败),或者正在被调用并成功加载,其中万一这是您显示它的方式中的某个错误。
-
我刚刚注意到,当我在没有缓存的情况下刷新页面 (ctrl+f5) 时,图像不显示。但这已成功下载(在萤火虫中检查)。当您仅刷新页面并允许浏览器仅缓存(仅 F5)时,图像是可见的。也许它会帮助你
-
您确定不应该等到图像加载完毕,即以某种方式使用图像的 onload 事件,然后再开始使用它们?
-
加载图像需要一些时间,这就是为什么当您重新加载页面(缓存版本)时它们会正确显示的原因。
-
你什么时候开始这个过程?我的猜测是在你开始画布代码之前图像没有完全加载(它在图像从第一次被缓存时起作用,因为 then 它们加载速度足够快以至于它们'在您的代码运行之前准备好。)尝试像 this question 中提到的 Paul Irish 的“加载图像”插件,而不是
ready。
标签: javascript jquery css canvas image-manipulation