Node.js:图像大小调整没有ImageMagick

我正在Node.js(+ express 4)上开发一个Web应用程序,用户可以通过将其上传到服务器来设置其configuration文件映像。 我们已经限制了文件mimetype和max filesize,所以用户不能上传超过200KB的png或者jpeg图片。

问题是我们想将上传的图像分辨率调整为200×200,以改善页面加载和节省磁盘空间。 经过一番研究,所有答案都指向使用基于ImageMagick或GraphicsMagick的任何模块。

然而,不得不安装ImageMagick / GraphicsMagick做一个简单的图像resize似乎对我来说太过于矫枉过正,所以,有没有其他的解决scheme比这个Node.js?

我最近开始为NodeJS开发一个没有任何运行时依赖的image processing模块( 阅读为什么 )。 它还处于早期阶段,但已经可以使用。

你所要求的将做如下:

image.resize(200, 200, function(err, image){ // encode resized image to jpeg and get a Buffer object image.toBuffer('jpg', function(err, buffer){ // save buffer to disk / send over network / etc. }); }); 

更多信息在模块的Github回购 。

我会投票锐利 ,虽然看到在这篇文章结尾的免责声明。

 sharp('input.jpg') .resize(200, 200) .toFile('ouput.jpg', function(err) { // output.jpg is a 200 pixels wide and 200 pixels high image // containing a scaled and cropped version of input.jpg }); 

速度很快, 通常比基于最快的基于imagemagick的节点绑定速度快5倍 ,并且只运行在很less的内存中, 可能less了10倍 。 与图书馆的直接联系,对外部程序没有任何破坏,而图书馆本身比这个任务更快,更有效率。 它支持stream,缓冲区和文件系统input输出,色彩pipe理,透明度,承诺,覆盖,WebP,SVG等有用的东西。

锐利使用一个image processing库libvips 。 从0.12开始,一个预编译的libvips二进制文件与Linux和Windows软件包捆绑在一起,因此不存在外部依赖关系,只需执行npm install sharp就可以了。 如果您不使用Linux或Windows, 则可以在大多数平台上自动安装libvips 。

lwip是非常好的,但它也使用了一个image processing库, cimg ,它只是包含了一个源代码的副本。 另外,lwip速度不是很快,通常慢于10倍,需要大量的内存,甚至比imagemagick还要多。

(免责声明:我是libvips维护者,所以当然我不是很中立)

看看lwip: https : //github.com/EyalAr/lwip

非常简单和易于使用

 npm install lwip 

然后在你的节点代码中,

 // obtain an image object: require('lwip').open('image.jpg', function(err, image){ // check err... // define a batch of manipulations and save to disk as JPEG: image.batch() .scale(0.75) // scale to 75% .rotate(45, 'white') // rotate 45degs clockwise (white fill) .crop(200) // crop a 200X200 square from center .blur(5) // Gaussian blur with SD=5 .writeFile('output.jpg', function(err){ // check err... // done. }); }); 

我已经在我的file upload器中成功实现了这个function,它的function就像一个魅力。

有一个很好的image processing库,完全用JavaScript编写,没有依赖任何其他库,吉姆。 https://github.com/oliver-moran/jimp

用法示例:

 var Jimp = require("jimp"); // open a file called "lenna.png" Jimp.read("lenna.png", function (err, lenna) { if (err) throw err; lenna.resize(256, 256) // resize .quality(60) // set JPEG quality .write("lena-small.jpg"); // save }); 

近来sharp已经很受欢迎了,但是和Magick绑定是一样的。

但是,不得不安装ImageMagick / GraphicsMagick做一个简单的图像resize似乎对我来说太过于矫枉过正

图像resize不过是简单的。 JPEG格式是特别复杂的,有几种方法可以缩放graphics,使结果具有不同的质量,其中很less容易实现。 存在image processing库来完成这项工作,所以如果没有别的原因你不能安装它们,那就去做吧。

canvas比ImageMagic 快2.3倍

您可以尝试比较Node.js模块的图像操作 – https://github.com/ivanoff/images-manipulation-performance

 author's results: sharp.js : 9.501 img/sec; minFreeMem: 929Mb canvas.js : 8.246 img/sec; minFreeMem: 578Mb gm.js : 4.433 img/sec; minFreeMem: 791Mb gm-imagemagic.js : 3.654 img/sec; minFreeMem: 804Mb lwip.js : 1.203 img/sec; minFreeMem: 54Mb jimp.js : 0.445 img/sec; minFreeMem: 82Mb 

如果你不需要一个大的图像,你可以在上传之前在客户端resize:

使用File API读取JavaScript中的文件

在上传到服务器之前,使用JavaScript调整客户端的大小

许多用户可能从智能手机上了解自己的情况,其中许多用户超过200kB。 请注意,客户端提供的数据不可信,所以服务器端检查仍然适用。

我正在使用lwip(如arvind以前的build议),但切换到PNG作物 。 它似乎对我来说快一点(Win 8.1 x64,Node v0.12.7)。 repo中的代码看起来非常轻巧,操作起来很简单。

 var pngcrop = require('png-crop'); var config = {left: 10, top: 100, height: 150, width: 150}; pngcrop.crop('cats.png','cats-cropped.png',config); 

当然,它只会做PNG文件…