node-canvas
在node-canvas中,TJ Holowaychuk 在展示 C++ 中的对象包装示例方面做得很好,以便在 javascript 端传回和使用。
我将在下面提取一个示例与您分享它是如何完成的。
来自Image.h
class Image: public node::ObjectWrap {
来自Image.cc
Persistent<FunctionTemplate> Image::constructor;
...
Handle<Value>
Image::New(const Arguments &args) {
HandleScope scope;
Image *img = new Image;
img->data_mode = DATA_IMAGE;
img->Wrap(args.This());
return args.This();
}
另一个例子是Canvas对象
class Canvas: public node::ObjectWrap {
并来自Canvas.cc
Handle<Value>
Canvas::New(const Arguments &args) {
HandleScope scope;
int width = 0, height = 0;
canvas_type_t type = CANVAS_TYPE_IMAGE;
if (args[0]->IsNumber()) width = args[0]->Uint32Value();
if (args[1]->IsNumber()) height = args[1]->Uint32Value();
if (args[2]->IsString()) type = !strcmp("pdf", *String::AsciiValue(args[2]))
? CANVAS_TYPE_PDF
: CANVAS_TYPE_IMAGE;
Canvas *canvas = new Canvas(width, height, type);
canvas->Wrap(args.This());
return args.This();
}
一旦需要 node-canvas 模块,它就像任何其他 javascript 对象一样容易访问。
fs.readFile(__dirname + '/someFile.jpg', function(err, image_data){
var Canvas = require('canvas');
var Image = Canvas.Image;
var img = new Image;
img.onload = function() {
var canvas = new Canvas(img.width,img.height);
var ctx = canvas.getContext('2d');
// grab and modify pixel data etc
}
img.src = image_data;
}
有关 ObjectWrap 的说明,请参阅nodejs 插件文档。