diff --git a/examples/files/multipage.tif b/examples/files/multipage.tif new file mode 100644 index 0000000..17d286c Binary files /dev/null and b/examples/files/multipage.tif differ diff --git a/src/OpenCV.cc b/src/OpenCV.cc index 14a498d..329360c 100755 --- a/src/OpenCV.cc +++ b/src/OpenCV.cc @@ -11,6 +11,7 @@ void OpenCV::Init(Local target) { target->Set(Nan::New("version").ToLocalChecked(), Nan::New(out, n).ToLocalChecked()); Nan::SetMethod(target, "readImage", ReadImage); + Nan::SetMethod(target, "readImageMulti", ReadImageMulti); } NAN_METHOD(OpenCV::ReadImage) { @@ -66,3 +67,43 @@ NAN_METHOD(OpenCV::ReadImage) { return; } + +NAN_METHOD(OpenCV::ReadImageMulti) { + Nan::EscapableHandleScope scope; + + REQ_FUN_ARG(1, cb); + + Local argv[2]; + argv[0] = Nan::Null(); + + std::vector mats; + try { + if (info[0]->IsString()) { + std::string filename = std::string(*Nan::Utf8String(info[0]->ToString())); + cv::imreadmulti(filename, mats); + } + } catch (cv::Exception& e) { + argv[0] = Nan::Error(e.what()); + argv[1] = Nan::Null(); + } + + Local output = Nan::New(mats.size()); + for (std::vector::size_type i = 0; i < mats.size(); i ++) { + Local im_h = Nan::New(Matrix::constructor)->GetFunction()->NewInstance(); + Matrix *img = Nan::ObjectWrap::Unwrap(im_h); + img->mat = mats[i]; + + output->Set(i, im_h); + } + + argv[1] = output; + + Nan::TryCatch try_catch; + cb->Call(Nan::GetCurrentContext()->Global(), 2, argv); + + if (try_catch.HasCaught()) { + Nan::FatalException(try_catch); + } + + return; +} diff --git a/src/OpenCV.h b/src/OpenCV.h index f0ff9d3..cc9a2b9 100755 --- a/src/OpenCV.h +++ b/src/OpenCV.h @@ -67,6 +67,7 @@ public: static void Init(Local target); static NAN_METHOD(ReadImage); + static NAN_METHOD(ReadImageMulti); }; #endif diff --git a/test/unit.js b/test/unit.js index 97767f3..cc7d365 100755 --- a/test/unit.js +++ b/test/unit.js @@ -216,6 +216,20 @@ test("Image read from file", function(assert){ }) }) +test("Multi-page image read from file", function(assert){ + cv.readImageMulti("./examples/files/multipage.tif", function(err, imgs){ + assert.ok(imgs); + assert.equal(imgs.length, 10); + for (var i = 0; i < imgs.length; i++) { + assert.ok(imgs[i]); + assert.equal(imgs[i].width(), 800); + assert.equal(imgs[i].height(), 600); + assert.equal(imgs[i].channels(), 3); + assert.equal(imgs[i].empty(), false); + } + assert.end(); + }) +}) test("read Image from buffer", function(assert){ cv.readImage(fs.readFileSync('./examples/files/opencv.png'), function(err, im){