2017-08-16 24 views
5

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ì?

Trả lời

0

Xây dựng bộ đệm một cách chính xác

encoding:nulllợi nhuận đệm thay vì chuỗi. (chuỗi cung cấp cho bạn unusably dữ liệu bị cắt xén)

const Vibrant = require('node-vibrant'); 
const request = require('request').defaults({encoding:null}); 

doRequest('https://i.stack.imgur.com/N4TSy.jpg') 
function doRequest(url){ 
    request.get(url, function(err, res, body) { 
    if(err)throw err 
     //Here is the magic 
     const buffer = new Buffer(body) 
     console.log(buffer) 
     let v = new Vibrant(buffer) 
     v.getPalette().then((palette) => console.log(palette)) 
    }) 
} 

tắm: Sử dụng dong dỏng

arg imagePath Các constructor Vibrant được truyền trực tiếp cho các nhà xây dựng hình ảnh trừu tượng (NodeImage trong môi trường NodeJS và NodeImage sử dụng Jimp)

/*:USING JIMP:*/ 
doJimpRequest('https://i.stack.imgur.com/N4TSy.jpg') 
const Jimp = require('jimp') 
function doJimpRequest(url){ 
    Jimp.read(url, function (err, image) { 
    if(err)throw err 
    image.getBuffer(Jimp.AUTO,function(err, buffer){ 
     console.log(buffer) 
     let v = new Vibrant(buffer) 
     v.getPalette().then((palette) => console.log(palette)) 
    }) 
    }); 
} 
Các vấn đề liên quan