web-dev-qa-db-ja.com

Node.jsはWebから画像を取得し、base64でエンコードします

Webから画像を取得し、base64でエンコードしようとしています。

私がこれまで持っているものは基本的には:

var request = require('request');
var BufferList = require('bufferlist').BufferList;

bl = new BufferList(),

request({uri:'http://tinypng.org/images/example-shrunk-8cadd4c7.png',responseBodyStream: bl}, function (error, response, body) 
{
    if (!error && response.statusCode == 200) 
    {
        var type = response.headers["content-type"];
        var prefix = "data:" + type + ";base64,";
        var base64 = new Buffer(bl.toString(), 'binary').toString('base64');
        var data = prefix + base64;
        console.log(data);
    }
});

これはソリューションにかなり近いように見えますが、私はそれをうまく機能させることができません。データ型を認識し、出力を提供します。

data:image/png;base64

ただし、バッファリスト「bl」は空のようです。

前もって感謝します!

44
Aleksr9

BufferListは、機能がNode core。

var request = require('request').defaults({ encoding: null });

request.get('http://tinypng.org/images/example-shrunk-8cadd4c7.png', function (error, response, body) {
    if (!error && response.statusCode == 200) {
        data = "data:" + response.headers["content-type"] + ";base64," + new Buffer(body).toString('base64');
        console.log(data);
    }
});
117
Dan Kohn

最新、2017年末現在

さて、上記の答えと少しの研究を読んだ後、パッケージのインストールを必要としませんhttpモジュール(組み込み)で十分です!

[〜#〜] note [〜#〜]:ノードバージョン6.xで使用したため、上記のバージョンにも適用できると思います。

_var http = require('http');

http.get('http://tinypng.org/images/example-shrunk-8cadd4c7.png', (resp) => {
    resp.setEncoding('base64');
    body = "data:" + resp.headers["content-type"] + ";base64,";
    resp.on('data', (data) => { body += data});
    resp.on('end', () => {
        console.log(body);
        //return res.json({result: body, status: 'success'});
    });
}).on('error', (e) => {
    console.log(`Got error: ${e.message}`);
});
_

私はそれが役立つことを願っています!

また、http.get(...)here についても確認してください!

19
Ankur Shah

base64-stream Node.jsモジュールを使用できます。これはストリーミングBase64エンコーダー/デコーダーです。この方法の利点は、すべてをメモリにバッファリングすることなく、要求モジュールを使用せずにイメージを変換できることです。

var http = require('http');
var base64encode = require('base64-stream').Encode;

http.get('http://tinypng.org/images/example-shrunk-8cadd4c7.png', function(res) {
    if (res.statusCode === 200)
        res.pipe(base64encode()).pipe(process.stdout);
});
8
Ross J

Axiosをhttpクライアントとして使用しているときに同じ問題が発生した場合、ソリューションは 'arraybuffer'の値でresponseTypeプロパティをリクエストオプションに追加することです:

let image = await axios.get('http://aaa.bbb/image.png', {responseType: 'arraybuffer'});
let returnedB64 = Buffer.from(image.data).toString('base64');

お役に立てれば

8
Yehuda

ロードに使用し、イメージをbase64文字列にエンコードします node-base64-image npmモジュール。

画像をダウンロードしてエンコードします。

var base64 = require('node-base64-image');

var options = {string: true};
base64.base64encoder('www.someurl.com/image.jpg', options, function (err, image) {
    if (err) {
        console.log(err);
    }
    console.log(image);
});

ローカル画像をエンコードする:

var base64 = require('node-base64-image');

var path = __dirname + '/../test.jpg',
options = {localFile: true, string: true};
base64.base64encoder(path, options, function (err, image) {  
    if (err) { console.log(err); }  
    console.log(image);  
}); 
1
webmato

画像の種類がわかっている場合は、node-fetch パッケージ。すべての人に合うわけではないかもしれませんが、私はすでにnode-fetch依存関係として、他の人が同様のボートにいる場合:

await fetch(url).then(r => r.buffer()).then(buf => `data:image/${type};base64,`+buf.toString('base64'));
0
user993683