使用像素操作修改画布在某种程度上不会;我不能完全在IE9中工作
Modifying a canvas using pixel manipulation somehow doesn't entirely work in IE9
第一次尝试在HTML5画布上进行像素操作时,我编写了一段代码来更改背景图像的特定部分。我正在使用遮罩图像来标记需要更改的特定部分。我画两条垂直线,一次画一个像素。我的代码看起来像:
var backgroundTemp=[0,0,false];
function generateBg(){
var bgGenCanvas = document.getElementById("backgroundGenerator");
var bgGenCtx = bgGenCanvas.getContext("2d");
var bgMaskCanvas = document.getElementById("backgroundMask");
var bgMaskCtx = bgMaskCanvas.getContext("2d");
if(backgroundTemp[0]==0){
var img = new Image();
img.onload=function(){
bgGenCtx.drawImage(this,0,0);
backgroundTemp[0]++;
generateBg();
}
backgroundTemp[0]++;
img.src = 'images/ordnerGreen.png';
}
if(backgroundTemp[1]==0){
var img = new Image();
img.onload=function(){
bgMaskCtx.drawImage(this,0,0);
backgroundTemp[1]++;
generateBg();
}
backgroundTemp[1]++;
img.src = 'images/ordnerMask.png';
}
if(backgroundTemp[0]==2 && backgroundTemp[1]==2 && backgroundTemp[2]==false){
backgroundTemp[2]=true;
var newColor=hexToRgb(settings.ordnerColor);
var genData = bgGenCtx.getImageData(0,0,bgGenCanvas.width,bgGenCanvas.height);
var maskData = bgMaskCtx.getImageData(0,0,bgMaskCanvas.width,bgMaskCanvas.height);
var darkenAt1=796*4;
var darkenAt2=996*4;
var widthPerLine=bgGenCanvas.width*4;
for(var i=0;i<maskData.data.length;i+=4){
var currentLine=Math.ceil(i/widthPerLine);
var red=maskData.data[i];
var green=maskData.data[i+1];
var blue=maskData.data[i+2];
if(red==255 && green==255 && blue==255){
red=newColor.r;
green=newColor.g;
blue=newColor.b;
if(darkenAt1==i || darkenAt2==i){
red-=Math.floor(red/4);
green-=Math.floor(green/4);
blue-=Math.floor(blue/4);
if(darkenAt1==i){
darkenAt1+=parseInt(widthPerLine);
}
if(darkenAt2==i){
darkenAt2+=parseInt(widthPerLine);
}
}
genData.data[i]=red;
genData.data[i+1]=green;
genData.data[i+2]=blue;
}
}
bgGenCtx.putImageData(genData,0,0);
document.getElementById('viewerBackground').style.backgroundImage="url('"+bgGenCanvas.toDataURL()+"')";
}
}
$(window).load(function(){generateBg();});
起初,它随机地起作用或不起作用。有时结果是空的,有时是原始图像,有时是修改后的图像。我认为这些图像可能还没有完成加载,所以我添加了一个结构,以确保它们都能加载。这适用于Firefox和Chrome。然而,在IE中,问题仍然存在,每次我按F5时,我都会得到一个随机结果。
有人知道怎么解决这个问题吗?
根据图像加载速度(以及它们在缓存中的可用性),您最终可能会执行3次像素迭代,而不是仅执行一次。
在最坏的情况下,一旦指定了图像的src(如果图像在缓存中可用),就会执行onLoad侦听器
为了避免这种情况,您应该尝试按顺序加载图像(即从backgroundTemp[0]onLoad函数加载backgroundTemp[1]图像),并从backgroundTemp[1]onLoad启动像素迭代。
相关文章:
- 用javascript将script元素附加到头部;铬不能工作
- 为什么jQuery代码段在没有IFrame的情况下可以工作,而在有IFrame时却不能工作
- 为什么当async标志设置为false时,xmlhttprequest中的代码可以工作,而当它设置为true时却不能工作
- 引导程序's的javascript在本地工作,但在部署到服务器时不能工作
- JQuery脚本没有'Don’我不能工作两次
- "npm运行构建:css"不能工作,而当我自己运行脚本时是可以的
- ng样式在与的预标记中!重要的是不能工作
- angularjs 控制器在指令中使用控制器作为不能工作
- jQuery LightSlider不能工作,但在JSFiddle中工作得很好
- Javascript - 我如何让一个语句工作一次,如果它已经工作了 1 次,则不能工作,然后再次工作
- 我的查询获胜'因为一个剧本,它不能工作(它以错误的方式工作)!?但为什么呢?SESSIONS和PHP
- 我的Javascript代码没有'铬不能工作
- 使用JQuery调整图像大小和重新排列图像;第一次装载时不能工作
- 为什么不是'这个Javascript计算器不能工作
- Javascript在窗口中返回.onbeforeunload不会'铬不能工作
- Javascript代码包含在html中时可以工作,但单独加载/注入时则不能工作
- 简单的jquery选择器不会;铬不能工作
- 为什么不'这个Javascript函数不能工作
- 为什么不'这个js数组函数不能工作
- 视口比例;方向改变后不能工作