在JavaScript函数中加载图像
我有函数来获取图像像素的颜色在JavaScript函数中加载图像,javascript,image,function,canvas,html5-canvas,Javascript,Image,Function,Canvas,Html5 Canvas,我有函数来获取图像像素的颜色 function getImage(imgsrc){ var img = $( "<img>", { src: imgsrc }); var imageMap = new Object(); img.load(function() { var canvas = $('<canvas/>')[0].getContext('2d'); canvas.width = t
function getImage(imgsrc){
var img = $( "<img>", {
src: imgsrc
});
var imageMap = new Object();
img.load(function() {
var canvas = $('<canvas/>')[0].getContext('2d');
canvas.width = this.width;
canvas.height = this.height;
canvas.drawImage(this, 0, 0, this.width, this.height);
for(var i = 0;i < this.width;i++){
imageMap[i] = new Object();
for(var j = 0;j < this.width;j++){
var pixelData = canvas.getImageData(i, j, 1, 1).data;
imageMap[i][j] = rgbToHex(pixelData[0],pixelData[1],pixelData[2]);
}
}
console.log(imageMap[40][40]);
});
console.log(imageMap[40][40]);
return imageMap;
}
函数getImage(imgsrc){
var img=$(“')[0].getContext('2d');
canvas.width=this.width;
canvas.height=this.height;
canvas.drawImage(this,0,0,this.width,this.height);
for(var i=0;ithx.您的函数正在返回
未定义的,因为load
是异步的。getImage
正在尝试在load
完成加载之前返回一些内容
您需要将一个回调传递到getImage
,以便在图像加载后执行:
function getImage(imgsrc, callback){
var img = $( "<img>", {
src: imgsrc
});
var imageMap = new Object();
img.load(function() {
var canvas = $('<canvas/>')[0].getContext('2d');
canvas.width = this.width;
canvas.height = this.height;
canvas.drawImage(this, 0, 0, this.width, this.height);
for(var i = 0;i < this.width;i++){
imageMap[i] = new Object();
for(var j = 0;j < this.width;j++){
var pixelData = canvas.getImageData(i, j, 1, 1).data;
imageMap[i][j] = rgbToHex(pixelData[0],pixelData[1],pixelData[2]);
}
}
console.log(imageMap[40][40]);
callback(imageMap)
});
}
当然,您也可以在其他地方定义回调:
var myCallback = function(imageMap){
// Do stuff with imageMap here;
};
getImage("http://some.src.jpg", myCallback);
是异步的,这意味着代码将在停止工作时继续
如果要处理imagemap
,一个选项可以是在填充imagemap
时传递回调,类似于:
function yourCallback(imageMap){
// ...process imageMap;
}
function getImage(imgsrc, yourCallback) {
var img = $("<img>", {
src: imgsrc
});
var imageMap = new Object();
img.load(function () {
var canvas = $('<canvas/>')[0].getContext('2d');
canvas.width = this.width;
canvas.height = this.height;
canvas.drawImage(this, 0, 0, this.width, this.height);
for (var i = 0; i < this.width; i++) {
imageMap[i] = new Object();
for (var j = 0; j < this.width; j++) {
var pixelData = canvas.getImageData(i, j, 1, 1).data;
imageMap[i][j] = rgbToHex(pixelData[0], pixelData[1], pixelData[2]);
}
}
yourCallback(imageMap);
});
}
getImage(imgsrc,yourCallback);
函数回调(imageMap){
//…处理图像映射;
}
函数getImage(imgsrc,yourCallback){
var img=$(“')[0].getContext('2d');
canvas.width=this.width;
canvas.height=this.height;
canvas.drawImage(this,0,0,this.width,this.height);
对于(var i=0;i
既然promises开始获得[广泛]支持,您可以改为:
//定义一个公共加载函数:
函数loadImage(url){
返回新承诺(功能(解决、拒绝){
var img=新图像;
img.onload=function(){resolve(this)};
img.onerror=img.onabort=function(){reject(“加载图像时出错”)};
img.src=url;
})
}
//用法:
加载图像(“https://i.stack.imgur.com/ynBVu.gif)然后(函数(图像){
//在这里使用'image'
document.body.appendChild(图像);
})
这是因为加载是异步的。您不能通过异步调用返回。这是目前最准确的答案,因为所有当前浏览器都是如此。
function yourCallback(imageMap){
// ...process imageMap;
}
function getImage(imgsrc, yourCallback) {
var img = $("<img>", {
src: imgsrc
});
var imageMap = new Object();
img.load(function () {
var canvas = $('<canvas/>')[0].getContext('2d');
canvas.width = this.width;
canvas.height = this.height;
canvas.drawImage(this, 0, 0, this.width, this.height);
for (var i = 0; i < this.width; i++) {
imageMap[i] = new Object();
for (var j = 0; j < this.width; j++) {
var pixelData = canvas.getImageData(i, j, 1, 1).data;
imageMap[i][j] = rgbToHex(pixelData[0], pixelData[1], pixelData[2]);
}
}
yourCallback(imageMap);
});
}
getImage(imgsrc,yourCallback);