Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何提高Javascript画布填充_Javascript_Image_Performance_Canvas_Html5 Canvas - Fatal编程技术网

如何提高Javascript画布填充

如何提高Javascript画布填充,javascript,image,performance,canvas,html5-canvas,Javascript,Image,Performance,Canvas,Html5 Canvas,有人知道如何优化Javascript bucket fill的性能吗?我第一次尝试使用递归函数,但它遇到了堆栈溢出。当前代码在Chrome中运行正常,但Firefox将停止执行:-( var canvas={ 身高:300, 宽度:300 }; 颜色变异; var Imgaray=[]; var imgdata; $(文档).ready(函数(){ canvas.obj=document.createElement('canvas'); $('body').append(canvas.obj);

有人知道如何优化Javascript bucket fill的性能吗?我第一次尝试使用递归函数,但它遇到了堆栈溢出。当前代码在Chrome中运行正常,但Firefox将停止执行:-(

var canvas={
身高:300,
宽度:300
};
颜色变异;
var Imgaray=[];
var imgdata;
$(文档).ready(函数(){
canvas.obj=document.createElement('canvas');
$('body').append(canvas.obj);
$(canvas.obj.attr('height',canvas.height);
$(canvas.obj.attr('width',canvas.width);
var context=canvas.obj.getContext('2d');
var imageObj=新图像();
imageObj.onload=函数(){
drawImage(imageObj,0,0,canvas.height,canvas.width);
imgdata=context.getImageData(0,0,canvas.width,canvas.height);
};
imageObj.src='数据:图像/png;base64,IVBorW0KgoaaAnsuhueugaaswaaaescayaaab5FY51aagaeleqVR4xU2DC5WCVZX/Tz8mIQ8e0UAIIkGBSNA/CIG8ReurboqVRQ4pipxQDD11+CQRFV5F1GS9Cp9CpJ8RvCagRPVD/BxiQQQQQKbQgGgGgGgGgGgGgGg1V3V3V3V3QRU6F8QRU6F6F6F6F6F6F6F6F6F6F4F4F6F4F4F4F4F4F4F4F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F82.在一个新的研究领域中,一个研究领域中,一个研究领域中,一个研究领域中,一个研究领域中,一个研究领域中,一个研究领域中,一个研究领域中,一个研究领域中,一个研究领域中,一个研究领域中,一个研究领域中,一个研究领域中,一个研究领域中,一个研究领域中,一个研究领域中,一个研究一个研究领域中,一个研究领域,一个研究领域中,一个研究领域,一个研究领域,一个研究领域,一个研究领域,一个研究领域,一个研究领域,一个研究领域,一个研究领域,一个研究领域,一个研究领域,一个研究领域,一个研究领域,一个研究领域,一个研究领域,一个研究领域,一个研究领域,一个研究领域,一个研究领域,一个研究领域,一个研究领域,一个研究领域,一个研究领域,一个研究,一个研究,一个D8Z87AXQOY1J31GQWJHW+ZAaxe(一)在一个单词中,这个单词是一个单词。一个单词是一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一20W+IJPDZWJDQ0SReyDVW9LN2.2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4L/J3AXWJWSQQQWZ2.这两个研究是一个研究。一个研究是一个研究。一个研究是一个研究。一个研究是一个研究。一个研究是一个研究。一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个非非非政府,2个非政府。2个非政府,一个非非政府。2个非政府。2个非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非政府,非O9WVJHBHWCLY9xRGSP2(2)一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究成果,一种新的研究成果,一种新的研究成果,一种新的研究成果,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的技术,一代中国的研究成果,一代中国的研究成果,一代中国的研究成果,一代中国的研究成果,一代中国政府,一代中国政府,一代中国政府,一代中国政府的研究成果,一代中国政府在一代中国的研究成果,一代中国政府在一代中国的《中国的《中国政府的《中国政府管理层框架框架框架框架框架框架框架框架框架式(3号文文文文(即即即即XNEE3H9A5AEPTZXHDJY4.一种新的研究方法是一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究方法,一种新的研究,一种新的研究,一种新的研究,2 2 2个新的研究,一种新的研究4年8月4月4月4月4月4月8月8日,2月4月4月4月4月4月4月4月8日,2月8日,2月8日,2月8日,2月4月4月4月8日,2月8日,2月8日,2月8日,2月8日,2日,2月8日,2月8日,2月8日,2月8日,2月8日,2月4月8日,2月4月4月4月4月8日,2月8日,2是的2.一种新的vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv8AkuhrdGhSqXsblzlgo(2)这是一个JJJJJ3(3)这是一个关于(2)JJJJJ3(3)作为一个关于(3)的研究,这是一个关于(3)关于一个关于(3)的关于(3)关于一个关于(3)关于(3)关于(3)关于(3)关于一个关于(2)关于(3)关于(3)关于(3)关于(3)关于(6)关于(6)关于(6)关于(6)关于(6)关于(6)关于(6)关于(6)关于(6)关于(6)关于(6)关于(6)关于(6)关于(6)关于(6)关于(6)关于(8)关于(8)关于)关于(6)关于(8)关于(8)关于(8)关于(8)关于(8)关于(8)关于(8)关于(8)关于(8)关于(8)关于(8)关于(8)关于一个)关于)关于一个)T8782E61OQBW0CNWGO2.在一篇文章中,我们发现了一个新的研究成果。在一篇文章中,我们发现了一个新的研究成果。在一篇文章中,一个新的研究,一个新的研究,一个新的研究,一个新的研究,一个新的研究,一个新的研究,一个新的研究,一个新的研究,一个新的研究,一个新的研究,一个新的研究,一个新的研究,一个新的研究,一个研究,一个新的研究,一个新的一个研究,一个新的一个研究,一个研究,一个研究,一个新的一个新的一个新的一个研究,一个研究,一个新的一个研究,一个新的一个研究,一个新的一个研究,一个研究,一个研究,一个新的一个研究,一个新的一个研究,一个研究,一个研究,在一个研究,一个新的一个研究,WFILC+bsbZbjJQa7LKE36月6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 NLF5+U+3clun9W1onowjhretqe4月4月4日,一个中国的一个中国的一个中国的一个中国的一个中国的一个中国的一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,中国的一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,一个中国政府,中国的一些中国的中国中国的ZM4DOYEMAHLZLWXJSBZD5.WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWLTN1BWNMJSYBPIQZJCVS2.研究结果表明,该文对该文的研究成果以及该文对该文的研究成果进行了研究,并对该文的研究成果进行了分析,对该文的研究,对该文的研究成果进行了分析,并对该文的研究结果进行了分析,并对该文的研究结果进行了分析,并对该文提出了一份研究,对该文的研究结果提出了一份研究,并对该文的研究提出了一份研究,对该文提出了一份研究,对该文提出了一份研究,对该文提出了一份研究,对该文提出了一份研究,对该文提出了一份研究对该文的一份研究,对该文提出了一份研究,对该文提出了一份研究,对该文提出了一份研究,该文提出了一份研究,对该文提出了一份研究,对该文提出了一份研究,对该文提出了一份研究,对该文提出了一份研究,该文提出的一份研究,P4L8JAR0GT8CNVNVGDSNN1U4QBPV4AQ8M6PBUAKYAWVC9DE8BobFnpvVRRL22kPbC8Zn7NeeuaqaqazCoian+v5GB+BbSubjlPvkumW9QtGopJakCfk+W3k2GfxFxMgvzBzPxMyKpQ4Tied7KeeetRnWfxFfx1+Madwc0KHTMBK5AMSijas3KH3KH3KNHPQ4Spade/TgUSKS2Kokybu2GbKfR5IAO76JuQbNbNbNbNcTqbNbNcTaiKfKfKfKmKmKm8LvKm8LvKm8LvKm8LvKm8LvKmK
var canvas = {
  height: 300,
  width: 300
};

var color;
var imgArray = [];
var imgdata;

$(document).ready(function() {
  canvas.obj = document.createElement('canvas');

  $('body').append(canvas.obj);

  $(canvas.obj).attr('height', canvas.height);
  $(canvas.obj).attr('width', canvas.width);

  var context = canvas.obj.getContext('2d');
  var imageObj = new Image();

  imageObj.onload = function() {
    context.drawImage(imageObj, 0, 0, canvas.height, canvas.width);
    imgdata = context.getImageData(0, 0, canvas.width, canvas.height).data;
  };

  imageObj.src = 'data:image/png;base64,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';


  $('canvas').click(function(e) {
    color = getRGBA(getPos(e.pageX, e.pageY));
    addToImageArray(e.pageX, e.pageY, true);
    checkImage();

    $('#currentcolor').css('background-color', 'rgba('+color.r+','+color.g+','+color.b+','+color.a+')');

    for (var y = 0; y < canvas.height; y++) {
      for (var x = 0; x < canvas.width; x++) {
        var posarray = searchArray(x, y);

        if (posarray.inarray && posarray.inrange) {
          var poscolor = getRGBA(getPos(x, y));

          $('#imgholder').append('<div style="height: 1px; width: 1px; background-color: rgba('+poscolor.r+','+poscolor.g+','+poscolor.b+','+poscolor.a+'); display:inline-block; position:absolute; top: '+y+'px; left: '+x+'px"></div>');
        }
      }
    }

  });
});

function checkImage() {
  var changed = true;
  var i = 0;

  console.log('start');

  while (changed) {
    changed = false;

    for (var y = 0; y < canvas.height; y++) {
      for (var x = 0; x < canvas.width; x++) {
        var posarray = searchArray(x, y);

        if (posarray.inarray && posarray.inrange) {
          var pos = {
            top: {
              x: x,
              y: y-1
            },
            bottom: {
              x: x,
              y: y+1
            },
            left: {
              x: x-1,
              y: y
            },
            right: {
              x: x+1,
              y: y
            }
          };

          i++;

          //top
          var topposarray = searchArray(pos.top.x, pos.top.y);

          if (pos.top.y >= 0 && !topposarray.inarray) {
            if (inrange(color, getRGBA(getPos(pos.top.x, pos.top.y)))) {
              addToImageArray(pos.top.x, pos.top.y, true);
              changed = true;
            }
            else {
              addToImageArray(pos.top.x, pos.top.y, false);
            }
          }

          //bottom
          var bottomposarray = searchArray(pos.bottom.x, pos.bottom.y);

          if (pos.top.y <= canvas.height && !bottomposarray.inarray) {
            if (inrange(color, getRGBA(getPos(pos.bottom.x, pos.bottom.y)))) {
              addToImageArray(pos.bottom.x, pos.bottom.y, true);
              changed = true;
            }
            else {
              addToImageArray(pos.bottom.x, pos.bottom.y, false);
            }
          }

          //left
          var leftposarray = searchArray(pos.left.x, pos.left.y);

          if (pos.top.x >= 0 && !leftposarray.inarray) {
            if (inrange(color, getRGBA(getPos(pos.left.x, pos.left.y)))) {
              addToImageArray(pos.left.x, pos.left.y, true);
              changed = true;
            }
            else {
              addToImageArray(pos.left.x, pos.left.y, false);
            }
          }

          //right
          var rightposarray = searchArray(pos.right.x, pos.right.y);

          if (pos.top.x <= canvas.width && !rightposarray.inarray) {
            if (inrange(color, getRGBA(getPos(pos.right.x, pos.right.y)))) {
              addToImageArray(pos.right.x, pos.right.y, true);
              changed = true;
            }
            else {
              addToImageArray(pos.right.x, pos.right.y, false);
            }
          }
        }
      }
    }
  }

  console.log('done');
  $('#currentcolor').html('loops: '+ i);
}

function crange(color1, color2) {
  return (color1 > color2-10 && color1 < color2+10);
}

function inrange(color1, color2) {
  if (crange(color1.r,color2.r) && crange(color1.g,color2.g) && crange(color1.b,color2.b)) {
    return true;
  }
  else {
    return false;
  }
}

function searchArray(x, y) {
  if (imgArray[y] !== undefined && imgArray[y][x] !== undefined) {
    return {
      inarray: true,
      inrange: imgArray[y][x]
    };
  }
  else {
    return {
      inarray: false
    };
  }
}

function addToImageArray(x, y, inrange) {
  if (imgArray[y] === undefined) {
    imgArray[y] = [];
  }

  imgArray[y][x] = inrange;
}

function getRGBA(pos) {
  var color = {
    r: imgdata[pos],
    g: imgdata[pos+1],
    b: imgdata[pos+2],
    a: imgdata[pos+3]
  };

  return color;
}

function getPos(x, y) {
  var pos = (y * 4)* canvas.width;
  pos += (x*4);

  return pos;
}