2017-08-16 92 views
5

Jd veya Canvas kullanarak node.js'de resim alma işlemim var. İndirme işlemi sırasında, arka uçta Vibrant.js kullanarak renk örnekleri çıkarmak istiyorum. Aşağıdaki kodumun hiçbiri işe yaramıyor.jsdom veya Canvas node.js öğesini kullanarak Vibrant.js örneklerini alın

kullanma 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'; 

kullanma Tuval

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'; 

}); 

Ben Vibrant.js URL'yi kullanabilirsiniz ama bu başka http GET kullanarak Bluebird ve ben ağı arama önlemek gerekir Tekrar yükle.

Bence Vibrant.js, Node.js.'deki Image nesnesini anlamak için zor bir zamana sahip.

Uygun Image sınıfını Vibrant.js'ye iletebilmem için buradaki geçici çözüm nedir?

cevap

0

bir tamponu yerine dizeleri arasında doğru

encoding:nulldöner tampon oluşturma.

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)) 
    }) 
} 
(dizeleri size unusably bozuk verileri verir)

Ekstra: JIMP

Canlı şantiye imagePath arg doğrudan NodeJS çevre ve NodeImage soyut Görüntü yapıcısı (NodeImage geçirilir kullanma kullanmaktadır 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)) 
    }) 
    }); 
}