2

我想从url获取图像并通过nodejs对该图像进行base64编码,然后通过base64编码显示该图像,但此代码不正确。此代码保存不正确的 png 文件。

var http = require('http')
  , fs = require('fs')
  , options

options = {
    host: 'google.com'
  , port: 80
  , path: '/images/srpr/logo3w.png'
}

function base64_encode(bitmap) {  
    return new Buffer(bitmap).toString('base64');
}

function ImageReady(res2){
    var request = http.get(options, function(res){
        var imagedata = '';
        res.setEncoding('binary');

        res.on('data', function(chunk){
            imagedata += chunk;
        })

        res.on('end', function(){
            var base64encode = base64_encode(imagedata);
            res2.end('<img src="data:image/png;base64,'+base64encode+'" />');
            fs.writeFile('logo.png', imagedata, 'binary', function(err){
            if (err) throw err
            console.log('File saved.')
        })
        })

    })
}

var httpListen = require('http');
httpListen.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    ImageReady(res);
}).listen(8080);
console.log('Server running!');
4

4 回答 4

12

尝试这个:

var loadBase64Image = function (url, callback) {
    // Required 'request' module
    var request = require('request');

    // Make request to our image url
    request({url: url, encoding: null}, function (err, res, body) {
        if (!err && res.statusCode == 200) {
            // So as encoding set to null then request body became Buffer object
            var base64prefix = 'data:' + res.headers['content-type'] + ';base64,'
                , image = body.toString('base64');
            if (typeof callback == 'function') {
                callback(image, base64prefix);
            }
        } else {
            throw new Error('Can not download image');
        }
    });
};

在你的 node.js 应用程序的某个地方使用:

// ...
loadBase64Image('http://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Carcharhinus_falciformis_off_Cuba.jpg/180px-Carcharhinus_falciformis_off_Cuba.jpg', function (image, prefix) {
    res.send('<img src="' + prefix + image + '"') />;
});
// ...
于 2012-11-06T10:19:30.123 回答
2

我最近遇到了这种情况,我只是通过使用这个模块base64-img来克服 它,它只是从 url 中提取一个 base64 编码的图像


var base64Img = require('base64-img');

base64Img.requestBase64(url, function (err, res, body) {
    if (err) console.log(err)
    else {
        console.log(res)
        console.log(body)  
    }
});
于 2019-05-18T18:18:45.320 回答
1

我尝试使用@codef0rmer 代码,但没有成功......在阅读了要点评论后,我偶然发现了一个不依赖于“BufferList”外部库的解决方案,并且作为一种魅力......

所以这里是这个要点的链接!它是用 Coffee 写的,所有归功于@hackable

express = require("express")
request = require("request")
BufferList = require("bufferlist").BufferList //no longer needed
app = express.createServer(express.logger(), express.bodyParser())
app.get "/", (req, res) ->
  if req.param("url")
    url = unescape(req.param("url"))
    request
      uri: url
      encoding: 'binary'
    , (error, response, body) ->
      if not error and response.statusCode is 200
      data_uri_prefix = "data:" + response.headers["content-type"] + ";base64,"
        image = new Buffer(body.toString(), "binary").toString("base64")
        image = data_uri_prefix + image
        res.send "<img src=\"" + image + "\"/>"

app.listen 3000
于 2012-11-04T05:14:27.537 回答
1

尝试使用request npm 插件,

app.get('/', function(req, res){
  if(req.param("url")) {
    var url = unescape(req.param("url"));
    var bl = new BufferList();
    request({uri:url, responseBodyStream: bl}, function (error, response, body) {
      if (!error && response.statusCode == 200) {
        var data_uri_prefix = "data:" + response.headers["content-type"] + ";base64,";
        var image = new Buffer(bl.toString(), 'binary').toString('base64');                                                                                                                                                                 
        image = data_uri_prefix + image;
        res.send('<img src="'+image+'"/>');
      }
    }); 
  }
});

更多信息:https ://gist.github.com/583836

于 2012-07-01T06:47:25.680 回答