我的任务是在运行IE6的旧版计算机上提供实时视频供稿。为此,我使用基于Flash的填充程序来重新创建Canvas对象(IE <10中不支持)。这是自述文件:https://www.mapmsg.com/static/3rdparty/fxcanvas-0/ReadMe.html
现在,我现在这样获得imageData:
this.imageData=this.context.getImageData(0,0,this.width,this.height)
Shim文档不仅仅使用getImageData
。原因是:
我们不能使用规范中声明的画布图像数据,因为IE使用的内存管理器效率极低,因此在某些情况下它可能会占用所有可用的内存。因此fxCanvas使用的图像数据格式略有不同。
示例:
var cv = document.getElementById("cv");
var ctx = cv.getContext("2d");
ctx.setFillStyle("#ff0")
.setStrokeStyle("#0ff")
.strokeRect(10, 20, 30, 30)
.fillRect(30, 40, 50, 50)
.invoke("getImageData", 0, 0, cv.width, cv.height, function (imageData) {
// ... processing image data
});
想法是,所有图像处理都是在.invoke
内部的内置函数中完成的。
所有这些,我的问题很简单。我无法在该功能中进行所有图像处理。我想将imageData
返回到this.imageData
中,以便在最终使用putImageData
将其放回画布之前,可以在其他功能中使用它。
因此,我对此的愚蠢尝试是:
this.context.invoke("getImageData",0,0,this.width,this.height, function(imgdat){return imgdat});
this.imageData= imgdat;
不起作用。 imgdat
未声明。无论我做什么,似乎都无法用this.imageData
.invoke
这是我对javascript的首次体验,我正在尝试编辑未编写的代码(https://github.com/phoboslab/jsmpeg/blob/master/jsmpeg.min.js)。我非常希望将数据转换为程序已使用的格式,而不是重写所有内容以使其全部在.invoke
函数中发生。
答案 0 :(得分:1)
这似乎是一个简单的范围解析问题。
您会在函数内部收到imgdat
,这是一个回调,但是一旦函数完成,变量就消失了。
我在第一个片段中看不到您的this.imageData
。
我认为您需要做的是:
var cv = document.getElementById("cv");
var ctx = cv.getContext("2d");
var self = this; // <------------ important detail
ctx.setFillStyle("#ff0")
.setStrokeStyle("#0ff")
.strokeRect(10, 20, 30, 30)
.fillRect(30, 40, 50, 50)
.invoke("getImageData", 0, 0, cv.width, cv.height, function (imageData) {
// ... processing image data
self.imageData = imageData; //instead of this.imageData
});
//Now you can use imageData here.
this.imageData (...);
JavaScript中的this
键盘与您在其他语言上使用的键盘不同。