使用Nodejs和Imagemagick调整图像大小

使用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); 

testing图像是从文件系统中读取的,我想改变,以便testing图像是一个二进制string。

 var image = 'some long binray string representing an image.......'; 

我的计划是在Mongodb中存储二进制string并dynamic读取它们。

由于您正在使用spawn()来调用ImageMagick命令行convert ,因此常规方法是将中间文件写入临时目录,在临时目录中可以在使用后立即清理或作为预定/定时任务。

如果你想避免写文件进行转换,一个选项是使用base64编码你的图像并使用内联格式 。 这与图像在某些HTML电子邮件或网页中的编码类似。

  inline:{base64_file|data:base64_data} Inline images let you read an image defined in a special base64 encoding. 

注:您可以传递的命令行选项的大小有一个限制。Imagemagick文档build议5000个字节。 Base64编码的string比原来的大(维基百科build议大概137%的粗略指南),这可能是非常有限的,除非你显示缩略图。

另一个ImageMagick格式选项是短暂的 :

  ephemeral:{image_file} Read and then Delete this image file. 

如果你想避免I / O传递,你需要一个Node.js模块,它直接集成了像ImageMagick或GD这样的低级库,而不是包装命令行工具。

看看节点模块node-imagemagick 。 在模块的页面上有以下示例来resize和图像并将其写入文件…

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

PS。 还没有运行上面的代码。 将尽快做到这一点,但它应该给你一个如何asynchronousresize和stream文件的想法。

你试过什么了? 您可以使用GridFS来存储图像数据,并从那里检索作为一个stream..这在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返回的stream。