如果我理解有误,请原谅,但是看起来你找到了这段代码并尝试在不了解背后发生的事情的情况下使用它。即使你修复了“未定义图片(Image is not defined)”错误,还有很多其他问题。
我已经在本帖的最后放置了修复好的代码,但我建议您更深入地思考问题的代码:
什么是Image
?它从哪里来?您已导入http
、fs
和Canvas
,所以这些东西显然是定义过的。然而,Image
没有在任何地方定义过,也不是内置的。
事实证明,Image
来自于node-canvas模块,您使用Canvas = require('canvas')
导入了此模块。这意味着Image
可以作为Canvas.Image
使用。
重要的是要理解这是由您设置的导入导致的。您也可以轻松地使用abc = require('canvas'
,然后Image
将可用作abc.Image
。
ctx
是什么?它从哪里来?
同样,这是另一个变量,没有在任何地方定义。不像Image
,它不可用作Canvas.ctx
。它只是一个随意的变量名称,目前不对应任何内容,因此尝试在其上调用drawImage
将引发异常。
canvas
(小写)呢?那是什么?
您正在使用canvas.toDataURL
,但是没有任何名为canvas
的变量。您希望此代码片段执行什么操作?现在它只会抛出异常,说canvas未定义。
我建议您更仔细地阅读文档,并更深入地研究将任何示例代码复制到自己的应用程序中的方法。
这里是已修复的代码,并添加了一些注释以解释我所做的更改。我通过快速查看https://github.com/learnboost/node-canvas的文档来弄清楚这个问题。
var http = require('http'), fs = require('fs'),
Canvas = require('canvas');
http.createServer(function (req, res) {
fs.readFile(__dirname + '/image.jpg', function(err, data) {
if (err) throw err;
var img = new Canvas.Image;
img.src = data;
var canvas = new Canvas(img.width, img.height);
var ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0, img.width / 4, img.height / 4);
res.write('<html><body>');
res.write('<img src="' + canvas.toDataURL() + '" />');
res.write('</body></html>');
res.end();
});
}).listen(8124, "127.0.0.1");
console.log('Server running at http://127.0.0.1:8124/');
Image
就可以了,因为它在源代码(lib/canvas.js)中定义了Image = canvas.Image
。然而,除非你做出相同的定义,否则它在你自己的代码中不起作用。 - Rohan SinghImageObj.onload
吗? - Rayon