使用nodejs和imagemagick可以重新调整图像大小并将其发送到浏览器。
var http = require('http'),
spawn = require('child_process').spawn;
http.createServer(function(req, res) {
var image = 'test.jpg';
var convert = spawn('convert', [image, '-resize', '100x100', '-']);
convert.stdout.pipe(res);
convert.stderr.pipe(process.stderr);
}).listen(8080);
从文件系统读取测试图像,我想改变,以便测试图像是二进制字符串。
var image = 'some long binray string representing an image.......';
我的计划是将二进制字符串存储在Mongodb中并动态读取它们。
答案 0 :(得分:3)
查看节点模块node-imagemagick。模块页面上有以下示例,用于调整大小并将其写入并将其写入文件...
var fs = require('fs');
im.resize({
srcData: fs.readFileSync('kittens.jpg', 'binary'),
width: 256
}, function(err, stdout, stderr){
if (err) throw err
fs.writeFileSync('kittens-resized.jpg', stdout, 'binary');
console.log('resized kittens.jpg to fit within 256x256px')
});
您可以更改此代码以执行以下操作...
var mime = require('mime') // Get mime type based on file extension. use "npm install mime"
, fs = require('fs')
, util = require('util')
, http = require('http')
, im = require('imagemagick');
http.createServer(function (req, res) {
var filePath = 'test.jpg';
fs.stat(filePath, function (err, stat) {
if (err) { throw err; }
fs.readFile(filePath, 'binary', function (err, data) {
if (err) { throw err; }
im.resize({
srcData: data,
width: 256
}, function (err, stdout, stderr) {
if (err) { throw err; }
res.writeHead(200, {
'Content-Type': mime.lookup(filePath),
'Content-Length': stat.size
});
var readStream = fs.createReadStream(filePath);
return util.pump(readStream, res);
});
});
});
}).listen(8080);
聚苯乙烯。还没有运行上面的代码。将尽快尝试,但它应该让您了解如何异步调整大小和流式传输文件。
答案 1 :(得分:3)
由于您使用spawn()
来调用ImageMagick命令行convert
,因此通常的方法是将中间文件写入临时目录,以便在使用后立即清除它们或按计划进行清理/ cron job。
如果您想避免编写要转换的文件,可以尝试的一个选项是对图像进行base64编码并使用inline format。这类似于在某些HTML电子邮件或网页中编码图像的方式。
inline:{base64_file|data:base64_data}
Inline images let you read an image defined in a special base64 encoding.
注意:您可以传递的命令行选项的大小有限制.Imagemagick文档建议5000字节。 Base64编码的字符串比原始字符串大(维基百科建议使用137% larger的粗略指南),除非您显示缩略图,否则这可能非常有限。
另一个ImageMagick格式选项是ephemeral:
ephemeral:{image_file}
Read and then Delete this image file.
如果你想完全避免I / O传递,你需要一个Node.js模块直接集成像ImageMagick或GD这样的低级库,而不是包装命令行工具。
答案 2 :(得分:0)
到目前为止你尝试了什么?您可以使用GridFS存储图像数据并从那里检索为流..这在C#中..不确定这是否有帮助...
public static void UploadPhoto(string name)
{
var server = MongoServer.Create("mongodb://localhost:27017");
var database = server.GetDatabase("MyDB");
string fileName = name;
using (var fs = new FileStream(fileName, FileMode.Open))
{
var gridFsInfo = database.GridFS.Upload(fs, fileName);
var fileId = gridFsInfo.Id;
//ShowPhoto(filename);
}
}
public static Stream ShowPhoto(string name)
{
var server = MongoServer.Create("mongodb://localhost:27017");
var database = server.GetDatabase("MyDB");
var file = database.GridFS.FindOne(Query.EQ("filename",name));
var stream = file.OpenRead())
var bytes = new byte[stream.Length];
stream.Read(bytes,0,(int)stream.Length);
return stream;
}
您现在可以使用ShowPhoto返回的流。