多个canvas绘制图片后对其进行操作,得到的结果都是最后一个canvas的内容

年秒 2017-12-18 05:17:55
动态生成了多个canvas,每个canvas上绘制的是不同的图片,然后对每个canvas进行相同的操作,得到的结果应该是不同的,但是我算完之后他的每个canvas的结果都是最后一个canvas得到的结果。
怎么做可以得到每一个canvas的结果。

var arrboxG=[];
for (n = 0; n<imgSrc.length; n++){
var image = new Image();
imgs[n]=image;
image.src = imgSrc[n];
image.onload = function () { //为异步函数,所以将创建canvas放在onload中.
var oDiv=document.createElement('div'),
oCan = document.createElement('canvas'),
oP=document.createElement("p");
oDiv.appendChild(oCan);
oDiv.appendChild(oP);
$("#div").append(oDiv);
var context=oCan.getContext("2d");
//添加图片
var imgHeight = this.height;
var imgWidth = this.width;
imgWidth=oCan.width;
imgHeight=oCan.height;
context.drawImage(this,0,0,imgWidth,imgHeight);
var imageData =context.getImageData(0, 0,imgWidth,imgHeight);
var length = imageData.data.length;
//要对canvas进行的操作
for (var i = 0; i < length; i++) {
if (i % 4 === 0) {
if (imageData.data[i + 3] == 255) {
var hsl = rgbToHsl(imageData.data[i], imageData.data[i + 1], imageData.data[i + 2]);
if (hsl[0] >= 57 && hsl[0] <= 152 && hsl[1] >= 13 && hsl[1] <= 100 && hsl[2] >= 0 && hsl [2] <= 90) {
arrboxG.push(hsl);
}

}
}
}
}
})
...全文
756 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
老板111 2020-01-07
  • 打赏
  • 举报
回复
刚看了楼主和‘天际的海浪’讨论,异步函数不和for循环同时使用。
weixin_41451294 2017-12-19
  • 打赏
  • 举报
回复
 var arrboxG=[];
    (function loop(n) {
        if (n>=imgSrc.length) return;
        var image = new Image();
        image.src = imgSrc[n];
        image.onload = function () { //为异步函数,所以将创建canvas放在onload中.
            var oDiv=document.createElement('div'),
                    oCan = document.createElement('canvas'),
                    oP=document.createElement("p");
            oDiv.appendChild(oCan);
            oDiv.appendChild(oP);
            $("#div").append(oDiv);
            var context=oCan.getContext("2d");
            //添加图片
            var imgHeight = this.height;
            var imgWidth = this.width;
            imgWidth=oCan.width;
            imgHeight=oCan.height;
            context.drawImage(this,0,0,imgWidth,imgHeight);
            var imageData =context.getImageData(0, 0,imgWidth,imgHeight);
            var length = imageData.data.length;
            //要对canvas进行的操作
            for (var i = 0; i < length; i++) {
                if (i % 4 === 0) {
                    if (imageData.data[i + 3] == 255) {
                        var hsl = rgbToHsl(imageData.data[i], imageData.data[i + 1], imageData.data[i + 2]);

                        if (hsl[0] >= 57 && hsl[0] <= 152 && hsl[1] >= 13 && hsl[1] <= 100 && hsl[2] >= 0 && hsl [2] <= 90) {
                            arrboxG.push(hsl);
                        }

                    }
                }
            }


            loop(n+1);
            console.log('SSSSSS:   ', arrboxG)   //在这里打印出来的是没问题的,你在什么地方获取的数据呢
        }
  })(0);
天际的海浪 2017-12-19
  • 打赏
  • 举报
回复
引用 12 楼 qq_38879567 的回复:
[quote=引用 11 楼 jslang 的回复:] 你arrboxG定义的是一维数组,里面的是所有图片的数据,这些所有图片数据是合在一起放在一维数组里的。 在所有图片处理完之后 arrboxG.length是所有图片的数据加在一起的长度。 你是不是应该用二维数组,把每个图片的数据分开放啊。 另外,console.log()输出数组或对象时,数组或对象的属性是折叠起来的,当你展开折叠时显示的是你展开时的属性,不是输出时的属性。 要显示输出时的属性可以用 console.log(JSON.stringify(arr));
跪谢大佬!最后出来了不一样的结果了。 只是还有一个小问题,我有许多个一样的class名相同的p标签,我想把这些不同的结果房子p里面。 但是$(".className").html 出来得却是最后一个的记过,console.log却能够出来正确的结果请问是为什么?[/quote] $(".className").html()是同时对所有class包含className的元素一起设置html内容 要每次只对其中一个元素应该是 $(".className").eq(n).html() n是第几个元素的索引号
年秒 2017-12-19
  • 打赏
  • 举报
回复
引用 11 楼 jslang 的回复:
你arrboxG定义的是一维数组,里面的是所有图片的数据,这些所有图片数据是合在一起放在一维数组里的。 在所有图片处理完之后 arrboxG.length是所有图片的数据加在一起的长度。 你是不是应该用二维数组,把每个图片的数据分开放啊。 另外,console.log()输出数组或对象时,数组或对象的属性是折叠起来的,当你展开折叠时显示的是你展开时的属性,不是输出时的属性。 要显示输出时的属性可以用 console.log(JSON.stringify(arr));
跪谢大佬!最后出来了不一样的结果了。 只是还有一个小问题,我有许多个一样的class名相同的p标签,我想把这些不同的结果房子p里面。 但是$(".className").html 出来得却是最后一个的记过,console.log却能够出来正确的结果请问是为什么?
天际的海浪 2017-12-19
  • 打赏
  • 举报
回复
你arrboxG定义的是一维数组,里面的是所有图片的数据,这些所有图片数据是合在一起放在一维数组里的。 在所有图片处理完之后 arrboxG.length是所有图片的数据加在一起的长度。 你是不是应该用二维数组,把每个图片的数据分开放啊。 另外,console.log()输出数组或对象时,数组或对象的属性是折叠起来的,当你展开折叠时显示的是你展开时的属性,不是输出时的属性。 要显示输出时的属性可以用 console.log(JSON.stringify(arr));
年秒 2017-12-19
  • 打赏
  • 举报
回复
引用 7 楼 jslang 的回复:
看代码都没有问题,你是不是读取arrboxG中数据的方式不对
那应该怎么读取,我就只是用了arrboxG的length而已。

var lenG = arrboxG.length,
                    lenB=arrboxB.length;
这个用在了里面的for循环外面呀
年秒 2017-12-19
  • 打赏
  • 举报
回复
引用 8 楼 weixin_41451294 的回复:
 var arrboxG=[];
    (function loop(n) {
        if (n>=imgSrc.length) return;
        var image = new Image();
        image.src = imgSrc[n];
        image.onload = function () { //为异步函数,所以将创建canvas放在onload中.
            var oDiv=document.createElement('div'),
                    oCan = document.createElement('canvas'),
                    oP=document.createElement("p");
            oDiv.appendChild(oCan);
            oDiv.appendChild(oP);
            $("#div").append(oDiv);
            var context=oCan.getContext("2d");
            //添加图片
            var imgHeight = this.height;
            var imgWidth = this.width;
            imgWidth=oCan.width;
            imgHeight=oCan.height;
            context.drawImage(this,0,0,imgWidth,imgHeight);
            var imageData =context.getImageData(0, 0,imgWidth,imgHeight);
            var length = imageData.data.length;
            //要对canvas进行的操作
            for (var i = 0; i < length; i++) {
                if (i % 4 === 0) {
                    if (imageData.data[i + 3] == 255) {
                        var hsl = rgbToHsl(imageData.data[i], imageData.data[i + 1], imageData.data[i + 2]);

                        if (hsl[0] >= 57 && hsl[0] <= 152 && hsl[1] >= 13 && hsl[1] <= 100 && hsl[2] >= 0 && hsl [2] <= 90) {
                            arrboxG.push(hsl);
                        }

                    }
                }
            }


            loop(n+1);
            console.log('SSSSSS:   ', arrboxG)   //在这里打印出来的是没问题的,你在什么地方获取的数据呢
        }
  })(0);
就是在那里,可以打印出来结果,只是打印出来的都是一样
天际的海浪 2017-12-18
  • 打赏
  • 举报
回复
看代码都没有问题,你是不是读取arrboxG中数据的方式不对
年秒 2017-12-18
  • 打赏
  • 举报
回复
引用 5 楼 jslang 的回复:
rgbToHsl函数的代码发一下

function rgbToHsl(r, g, b) {

                r /= 255, g /= 255, b /= 255;
                var max = Math.max(r, g, b), min = Math.min(r, g, b);
                var h, s, l = (max + min) / 2;

                if (max == min) {
                    h = s = 0; // achromatic
                } else {
                    var d = max - min;
                    s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
                    h = (r == max ? (g - b) / d : g == max ? 2 + (b - r) / d : 4 + (r - g) / d) * 0.6;
                }
                return [Math.floor(h * 100), Math.round(s * 100), Math.round(l * 100)];
            }
天际的海浪 2017-12-18
  • 打赏
  • 举报
回复
rgbToHsl函数的代码发一下
年秒 2017-12-18
  • 打赏
  • 举报
回复
引用 3 楼 jslang 的回复:
是哪里一样,是canvas中的图片一样,还是arrboxG中的数据一样 如果是arrboxG中的数据一样,请检查rgbToHsl函数每次返回的是否都是同一个对象(数组)的引用地址
是arrboxG的数据一样,引用地址确实是同一个,对canvas操作前还不是,一操作就变成一样的了。 这种的怎么办,我不会改,但是我又很急...TAT...
天际的海浪 2017-12-18
  • 打赏
  • 举报
回复
是哪里一样,是canvas中的图片一样,还是arrboxG中的数据一样 如果是arrboxG中的数据一样,请检查rgbToHsl函数每次返回的是否都是同一个对象(数组)的引用地址
年秒 2017-12-18
  • 打赏
  • 举报
回复
引用 1 楼 jslang 的回复:
有异步函数就别用for循环。要用递归

	var arrboxG=[];
	(function loop(n) {
		if (n>=imgSrc.length) return;
        var image = new Image();
        image.src = imgSrc[n];
        image.onload = function () { //为异步函数,所以将创建canvas放在onload中.
            var oDiv=document.createElement('div'),
                    oCan = document.createElement('canvas'),
                    oP=document.createElement("p");
            oDiv.appendChild(oCan);
            oDiv.appendChild(oP);
            $("#div").append(oDiv);
            var context=oCan.getContext("2d");
            //添加图片
            var imgHeight = this.height;
            var imgWidth = this.width;
            imgWidth=oCan.width;
            imgHeight=oCan.height;
            context.drawImage(this,0,0,imgWidth,imgHeight);
            var imageData =context.getImageData(0, 0,imgWidth,imgHeight);
            var length = imageData.data.length;
            //要对canvas进行的操作
            for (var i = 0; i < length; i++) {
                if (i % 4 === 0) {
                    if (imageData.data[i + 3] == 255) { 
                        var hsl = rgbToHsl(imageData.data[i], imageData.data[i + 1], imageData.data[i + 2]);
                        if (hsl[0] >= 57 && hsl[0] <= 152 && hsl[1] >= 13 && hsl[1] <= 100 && hsl[2] >= 0 && hsl [2] <= 90) {
                            arrboxG.push(hsl);
                        }
                       
                    }
                }
            }
            loop(n+1);
        }
  })(0);

我为啥还是一样的,得到的结果还最后一个的
天际的海浪 2017-12-18
  • 打赏
  • 举报
回复
有异步函数就别用for循环。要用递归

	var arrboxG=[];
	(function loop(n) {
		if (n>=imgSrc.length) return;
        var image = new Image();
        image.src = imgSrc[n];
        image.onload = function () { //为异步函数,所以将创建canvas放在onload中.
            var oDiv=document.createElement('div'),
                    oCan = document.createElement('canvas'),
                    oP=document.createElement("p");
            oDiv.appendChild(oCan);
            oDiv.appendChild(oP);
            $("#div").append(oDiv);
            var context=oCan.getContext("2d");
            //添加图片
            var imgHeight = this.height;
            var imgWidth = this.width;
            imgWidth=oCan.width;
            imgHeight=oCan.height;
            context.drawImage(this,0,0,imgWidth,imgHeight);
            var imageData =context.getImageData(0, 0,imgWidth,imgHeight);
            var length = imageData.data.length;
            //要对canvas进行的操作
            for (var i = 0; i < length; i++) {
                if (i % 4 === 0) {
                    if (imageData.data[i + 3] == 255) { 
                        var hsl = rgbToHsl(imageData.data[i], imageData.data[i + 1], imageData.data[i + 2]);
                        if (hsl[0] >= 57 && hsl[0] <= 152 && hsl[1] >= 13 && hsl[1] <= 100 && hsl[2] >= 0 && hsl [2] <= 90) {
                            arrboxG.push(hsl);
                        }
                       
                    }
                }
            }
            loop(n+1);
        }
  })(0);

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧