【发布时间】:2018-08-01 03:15:15
【问题描述】:
我正在尝试编写一个程序,将图像加载到画布中,然后在加载后从中读取图像数据。以下是执行不同操作的两个函数。
该函数读取文件输入数组中的下一张图片
function readNextImage(i) {
d = new $.Deferred();
if (fileUpload.files && fileUpload.files[i]) {
var FR = new FileReader();
FR.onload = function(e) {
fabric.Image.fromURL(e.target.result, function(img) {
img.set({
left: 0,
top: 0,
evented: false
});
img.scaleToWidth(canvas.width);
img.setCoords();
canvas.add(img);
})
};
FR.readAsDataURL(fileUpload.files[i]);
}
d.resolve();
return d.promise();
}
这个实际上是通过图像数据解析以从中提取信息
function read_image () {
d = new $.Deferred();
imgData = context.getImageData(0,0,canvas.width,canvas.height);
data = imgData.data;
var value_min=100;
var value_max=0;
var total_light=0;
var total_shadow=0;
for (var j=0; j<boundary.length; j+=1) {
var hsv = rgb2hsv(data[boundary[j]], data[boundary[j]+1], data[boundary[j]+2]);
if(hsv.v < value_min){
value_min = hsv.v;
}
if(hsv.v > value_max){
value_max = hsv.v;
}
}
var value_median = (value_min + value_max)/2;
for (var j=0; j<boundary.length; j+=1) {
var hsv = rgb2hsv(data[boundary[j]], data[boundary[j]+1], data[boundary[j]+2]);
if(hsv.v < value_median){
//console.log("this value:"+hsv.v);
total_shadow+=1;
} else {
total_light+=1;
}
}
var total_interception = total_shadow/boundary.length;
console.log("interception:" + total_interception);
total_interception = total_interception * 100;
total_interception = total_interception.toPrecision(4);
document.getElementById("interception").innerHTML=total_interception.toString()+"%";
d.resolve();
return d.promise();
}
最后是调用这两个函数的代码
for (var image_num=0; image_num<fileUpload.files.length; image_num+=1){
promise = readNextImage(image_num).then(read_image);
}
我读到了 Promise,因为它是异步执行的,我想强制它在执行任何其他操作之前将图像加载到画布中。目前,该程序正在执行read_image() 函数的次数与文件输入中的图像一样多,然后在执行此操作之后,它会按顺序加载带有图像的画布。所以现在它只从加载的第一张图片中获取数据。
【问题讨论】:
-
read_image是同步的,它不应该返回一个承诺。
标签: javascript jquery canvas promise