【发布时间】:2014-02-27 17:11:54
【问题描述】:
我正在尝试在页面上构建一个画布,每当用户在其上绘制某些内容时,该画布就会自行更新。但是,看起来好像以下代码(来自 index.html)导致了错误
socket.on("drawn_complete",function(data){
ctx.putImageData(data.image,0,0);
console.log("Everthing worked technically");
});
这是在我的控制台中输出的错误:
Uncaught TypeError: Failed to execute 'putImageData' on 'CanvasRenderingContext2D': No function was found that matched the signature provided
我的 data.image 是从以下代码返回的:
ctx.getImageData(0,0,200,100); // ctx is canvas.getContext("2d")
这是我的 html 中的画布:
<canvas id="myCanvas" width="200" height="100"
style="border:1px solid #000000;">
</canvas>
这是完整的nodeJS:
var http = require("http")
var server = http.createServer(handler).listen(1337);
console.log("Server created at 127.0.0.1:1337");
var io = require("socket.io").listen(server);
function handler(req,res)
{
console.log("Client Connected");
res.writeHead(200,{"Content-type": "text/plain"});
res.end("Hello World");
}
io.sockets.on("connection",function(socket){
socket.on("drawing",function(data){
var image = data["image"];
io.sockets.emit("drawn_complete",image);
});
});
当用户在我的画布内握住并移动鼠标时,就会开始绘图:
代码如下:
c.onmousedown = function(evt){
moving = true
};
c.onmousemove = function(evt){
if(moving == true)
{
console.log("holding and moving");
var x = evt.clientX - rect.left;
var y = evt.clientY - rect.top;
console.log("X: " + x + " Y: " + y);
ctx.fillRect(x,y,1,1);
socket.emit("drawing",{"image": ctx.getImageData(0,0,200,100)});
}
};
c.onmouseup = function(evt){
moving = false;
};
更新
这是整个脚本:
<script>
window.onload = function(){
var socket = io.connect("http://localhost:1337");
socket.on("drawn_complete",function(data){
ctx.putImageData(data.image,0,0);
console.log("Everthing worked technically");
});
var c = document.getElementById("myCanvas");
var moving = false;
console.log(c);
var ctx = c.getContext("2d");
var rect = c.getBoundingClientRect();
c.onmousedown = function(evt){
moving = true
};
c.onmousemove = function(evt){
if(moving == true)
{
console.log("holding and moving");
var x = evt.clientX - rect.left;
var y = evt.clientY - rect.top;
console.log("X: " + x + " Y: " + y);
ctx.fillRect(x,y,1,1);
socket.emit("drawing",{"image": ctx.getImageData(0,0,200,100)});
}
};
c.onmouseup = function(evt){
moving = false;
};
};
</script>
更新 正如帕拉尼克建议的那样,我已尝试在发出图像之前对其进行序列化:
var stringfy = JSON.stringify(ctx.getImageData(0,0,200,100));
socket.emit("drawing",{"image": stringfy});
看起来控制台仍然抛出同样的错误
更新(2) 正如@Palanik 建议的那样,我尝试序列化该对象。我知道下面的代码并不完全是他推荐的,但我只想强调一些非常奇特的东西:
发件人:
var stringfy = ctx.getImageData(0,0,200,100);
console.log(stringfy)
var sent = JSON.stringify(stringfy);
socket.emit("drawing",{"image": sent});
接收者
socket.on("drawn_complete",function(data){
imageData = JSON.parse(data.image);
console.log(imageData);
ctx.putImageData(imageData,0,0);
console.log("Everthing worked technically");
});
这里有趣的是 imageData 的 console.log 打印出一个与 ImageData 具有相同属性的对象。高度、宽度和原始数据。看这里:
{"height":100,"width":200,"data":{"0":0,"1":0,"2":0,"3":0,"4":0,"5 etc... }
所以我可以从这里看到我能够取回对象。如果我在 java 中,一个演员就足够了;
ImageData object = (ImageData) imageData // Is there a way to do this?
【问题讨论】:
-
在客户端,你如何初始化画布的
ctx? -
@jibsales ctx = canvas.getContext("2d")
-
对不起,我应该更具体一些。你在哪里初始化?这可能与套接字尚未准备好有关。
-
@jibsales 我已经包含了整个脚本。检查更新
-
@bula 当您进行更新时,您不必用粗体书写:Update # 并再次放置相同的代码并进行一些更改。您可以编辑之前的文本并保持问题清晰。
标签: javascript html node.js canvas