在Javascript中使用画布创建图像
我似乎遇到了一条错误消息,说明我在调试时遇到了困难。我要做的是动态创建一个像这样的图像 ( )用帆布 我收到的错误消息是:在Javascript中使用画布创建图像,javascript,canvas,Javascript,Canvas,我似乎遇到了一条错误消息,说明我在调试时遇到了困难。我要做的是动态创建一个像这样的图像 ( )用帆布 我收到的错误消息是: [Exception... "An invalid or illegal string was specified" code: "12" nsresult: "0x8053000c (NS_ERROR_DOM_SYNTAX_ERR)"] 我在谷歌上搜索过,似乎有很多原因导致这个错误消息,但我似乎找不到任何与canvas相关的具体原因 这是我的密码: var newCa
[Exception... "An invalid or illegal string was specified" code: "12" nsresult: "0x8053000c (NS_ERROR_DOM_SYNTAX_ERR)"]
我在谷歌上搜索过,似乎有很多原因导致这个错误消息,但我似乎找不到任何与canvas相关的具体原因
这是我的密码:
var newCanvas = document.createElement('canvas');
newCanvas.height="30";
newCanvas.width="113";
document.body.appendChild(newCanvas);
var context = newCanvas.getContext('2d');
context.fillStyle = '#FFFFFF';
context.fillRect(0, 0, 113, 15);
context.fillStyle = '#000000';
context.fillRect(0, 15, 113, 30);
var numCanH = Number(newCanvas.height);
var numCanW = Number(newCanvas.width);
var imgd;
if (context.createImageData) {
console.log('context.createImageData');
imgd = context.createImageData(numCanW, numCanH);
}
else if (context.getImageData) {
console.log('context.getImageData');
imgd = context.getImageData(0, 0, numCanW, numCanH);
}
else {
console.log('else');
imgd = {'width' : numCanW, 'height' : numCanH, 'data' : new Array(numCanW*numCanH*4)};
}
var pix = imgd.data;
var ndv = numCanW/6;
for (var i = 0; i <= numCanH; i++) {
var a=1-Math.abs(2*i-numCanH)/numCanH;
for (var j = 0; j < numCanW; j+=4) {
var bitUp = Math.ceil((255/130)*j);
var bitDown = 255-bitUp;
if(j<(ndv)){ //Red to Yellow - (rgb) 255,0,0 to 255,255,0
pix[j] = 255; // red channel
pix[j+1] = bitUp; // green channel
pix[j+2] = 0; // blue channel
}
else if(j>(ndv) && j<(ndv)*2){ //Yellow to Green - (rgb) 255,255,0 to 0,255,0
pix[j] = 255; // red channel
pix[j+1] = bitDown; // green channel
pix[j+2] = 0; // blue channel
}
else if(j>(ndv)*2 && j<(ndv)*3){ //Green to Cyan - (rgb) 0,255,0 to 0,255,255
pix[j] = 0; // red channel
pix[j+1] = 255; // green channel
pix[j+2] = bitUp; // blue channel
}
else if(j>(ndv)*3 && j<(ndv)*4){ //Cyan to Blue - (rgb) 0,255,255 to 0,0,255
pix[j] = 0; // red channel
pix[j+1] = bitDown; // green channel
pix[j+2] = 255; // blue channel
}
else if(j>(ndv)*4 && j<(ndv)*5){ //Blue to Magenta - (rgb) 0,0,255 to 255,0,255
pix[j] = bitUp; // red channel
pix[j+1] = 0; // green channel
pix[j+2] = 255; // blue channel
}
else if(j>(ndv)*5 && j<(ndv)*6){ //Magenta to Red - (rgb) 255,0,255 to 255,0,0
pix[j] = 255; // red channel
pix[j+1] = 0; // green channel
pix[j+2] = bitDown; // blue channel
}
pix[j+3] = a; // alpha channel+
console.log('bitUp '+bitUp);
console.log(typeof bitUp);
console.log('bitDown '+bitDown);
console.log(typeof bitDown);
console.log('a '+j);
console.log(typeof a);
console.log('j '+j);
console.log(typeof j);
console.log('i '+i);
console.log(typeof i);
console.log(imgd);
console.log('before context.putImageData');
context.putImageData(imgd, j,i);
console.log('after context.putImageData');
}
}
var newCanvas=document.createElement('canvas');
newCanvas.height=“30”;
newCanvas.width=“113”;
document.body.appendChild(newCanvas);
var context=newCanvas.getContext('2d');
context.fillStyle='#FFFFFF';
fillRect(0,0,113,15);
context.fillStyle='#000000';
fillRect(0,15,113,30);
var numCanH=编号(newCanvas.height);
var numCanW=编号(newCanvas.width);
var-imgd;
if(context.createImageData){
log('context.createImageData');
imgd=context.createImageData(numCanW,numCanH);
}
else if(context.getImageData){
log('context.getImageData');
imgd=context.getImageData(0,0,numCanW,numCanH);
}
否则{
console.log('else');
imgd={'width':numCanW,'height':numCanH,'data':新数组(numCanW*numCanH*4)};
}
var pix=imgd.data;
var ndv=numCanW/6;
对于(var i=0;i您的putImageData调用试图将整个imgd(创建为画布的宽度和高度)绘制到画布中,左上角位于(j,i)。这在lop的第一次迭代后失败,因为imgd的底部/右侧脱离了画布的底部/右侧
在外循环外部调用putImageData,并使其始终在(0,0)处绘制。此外,在计算要设置的像素的数组索引时,不要忘记添加i*numcnw*4;请注意,当您在颜色组件而不是像素上交互时,您的内部循环需要从0到iCanW*4,而不是从0到iCanW。我最近发现了如何将RBG值的2D数组复制到画布上-这在某些情况下可能很有用.