Tôi có một quá trình để lấy hình ảnh trong node.js bằng cách sử dụng jsdom hoặc Canvas. Trong quá trình tải xuống, tôi muốn trích xuất các mẫu bằng cách sử dụng Vibrant.js trong phần cuối. Không mã nào của tôi bên dưới hoạt động.Lấy các bản mẫu Vibrant.js bằng jsdom hoặc Canvas cho node.js
Sử dụng jsdom
const Vibrant = require('node-vibrant');
const request = require('request');
var jsdom = require("jsdom").jsdom;
var window = jsdom().defaultView;
var document = jsdom('<html><body></body></html>', {
features: {
FetchExternalResources : ['img']
}
});
var imgDom = document.createElement("img");
imgDom.onload = function() {
console.log('onload triggered');
// var imgData = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAGElEQVQIW2P4DwcMDAxAfBvMAhEQMYgcACEHG8ELxtbPAAAAAElFTkSuQmCC';
// var imgData = imgDom.replace(/^data:image\/gif;base64,/, "")
// var binaryData = new Buffer(imageData, 'base64').toString('binary');
request.get(imgDom.src, function(err, res, body) {
console.log(body.length);
// Spit out a bunch of base64 code
let v = new Vibrant(new Buffer(body, 'binary').toString('base64'));
// Error image.load not found
// let v = new Vibrant(new Buffer(body, 'binary').toString('base64'), {ImageClass: window.Image});
// Error: Path must be a string without null bytes
// let v = new Vibrant(new Buffer(body, 'base64').toString('binary'));
// v.getPalette().then((palette) => console.log(palette));
var swatches = v.swatches();
console.log(JSON.stringify(swatches));
for (var swatch in swatches)
if (swatches.hasOwnProperty(swatch) && swatches[swatch])
console.log(swatch, swatches[swatch].getHex())
});
}
imgDom.src = 'https://unsplash.it/200';
// imgDom.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAGElEQVQIW2P4DwcMDAxAfBvMAhEQMYgcACEHG8ELxtbPAAAAAElFTkSuQmCC';
Sử dụng Canvas
const Vibrant = require('node-vibrant');
const request = require('request');
const Canvas = require('canvas-prebuilt');
const Image = Canvas.Image;
var imgDom = new Image;
imgDom.onload = function() {
console.log('onload triggered');
let v = new Vibrant(imgDom, {ImageClass: Canvas.Image});
v.getPalette().then((palette) => console.log(palette));
};
request.get('https://unsplash.it/200', function(err, res, body) {
console.log(body.length);
imgDom.src = new Buffer(body);
// imgDom.src = new Buffer(body, 'binary').toString('base64');
// imgDom.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAGElEQVQIW2P4DwcMDAxAfBvMAhEQMYgcACEHG8ELxtbPAAAAAElFTkSuQmCC';
});
tôi có thể sử dụng URL trong Vibrant.js nhưng đó là một http GET sử dụng Bluebird và tôi cần phải tránh gọi mạng tải xuống lại.
Tôi nghĩ Vibrant.js có một thời gian khó hiểu đối tượng Hình ảnh trong Node.js.
Giải pháp thay thế ở đây để tôi có thể chuyển Lớp hình ảnh phù hợp thành Vibrant.js là gì?