Node.js:不使用ImageMagick调整图像大小

zac*_*cr0 73 image image-resizing node.js

我正在Node.js(+ express 4)上开发一个Web应用程序,用户可以通过将其上传到服务器来设置他们的个人资料图像.我们已经限制了文件mimetype和max filesize,因此用户无法上传超过200KB的png或jpeg图像.

问题是我们希望将上传的图像分辨率调整为(服务器端)为200x200,以改善页面加载并节省磁盘空间.经过一些研究,所有答案都指向使用基于ImageMagick或GraphicsMagick的任何模块.

但是,必须安装ImageMagick/GraphicsMagick进行简单的图像调整大小对我来说似乎太过分了,所以,Node.js还有除此之外的其他解决方案吗?

jcu*_*itt 76

我会投票支持锐利:

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
  });
Run Code Online (Sandbox Code Playgroud)

它速度快,通常比最快的基于imagemagick的节点绑定6倍,并且运行在非常小的内存中,可能少10倍.直接链接到libvips图像库,没有外部程序的炮轰,并且库本身比*magick更快,更高效.它支持流,缓冲和文件系统输入和输出,颜色管理,透明度,承诺,叠加,WebP,SVG等有用的东西.

截至0.20,npm将在大多数平台上自动下载完整的预编译二进制文件,因此不需要node-gyp.只需输入:

npm install sharp
Run Code Online (Sandbox Code Playgroud)

要么:

yarn add sharp
Run Code Online (Sandbox Code Playgroud)

你离开了.

  • 从v0.12.0开始,`sharp`不再具有Linux和Windows用户的任何外部运行时依赖性,因为它捆绑了预编译版本的libvips.您会发现调整大小操作比LWIP快10倍,并且只占内存使用量的一小部分. (7认同)
  • sharp添加了本地gif和svg支持版本0.15 http://sharp.dimens.io/en/stable/changelog (4认同)
  • @CoDEmanX也许首先尝试运行`npm install --global --production windows-build-tools`.另请参见https://github.com/Microsoft/nodejs-guidelines/blob/master/windows-environment.md#compiling-native-addon-modules (4认同)
  • `sharp`捆绑了图像处理库的二进制文件,但必须为您的精确节点版本编译连接节点的C++薄层.所以,是的,它需要一个工作的gyp. (2认同)

Eya*_*lAr 71

我最近开始为NodeJS开发一个没有任何运行时依赖性的图像处理模块(阅读原因).它还处于早期阶段,但已经可以使用了.

您要求的内容如下:

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.
    });
});
Run Code Online (Sandbox Code Playgroud)

有关该模块的Github回购的更多信息.

  • 我建议不要在2017年使用lwip.该软件包似乎不再受支持,它在Windows上甚至在Unix平台上都存在大量安装问题. (10认同)
  • 不幸的是,lwip是一个死的项目.[sharp](https://github.com/lovell/sharp)但似乎仍然在积极维护. (8认同)
  • 你的模块太棒了.但是,它需要很多内存.我试过`writeFile`一个`1.8Mb`图像,它需要130Mb的内存.之后,我通过将"4MB,11000x6000"图像调整为几个缩略图(640,560,480,...,160)进行测试,内存大约为1.7GB.那是一个错误吗? (5认同)
  • 嗨@Orion,感谢您的反馈.请转到Github回购并打开一个问题,其中包含更多细节(操作系统,版本,代码以重现这一点).我们一起试着解决这个问题:) (2认同)

Arv*_*ind 16

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

非常简单易用

npm install lwip
Run Code Online (Sandbox Code Playgroud)

然后在你的节点代码中

// 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.
    });

});
Run Code Online (Sandbox Code Playgroud)

我已经在我的文件上传器中成功实现了它,它就像一个魅力.

  • Btw @EyalAr是此节点模块的作者.他的评论也列在下面. (3认同)

edt*_*ech 11

有一个很好的图像处理库完全用JavaScript编写,没有依赖于任何其他库,Jimp.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
});
Run Code Online (Sandbox Code Playgroud)

  • sharp有一套基准:http://sharp.dimens.io/en/stable/performance ---在那个测试中,jimp比IM快5倍,比sharp慢30倍.当然,速度足够快,速度不是唯一要考虑的因素. (2认同)

Ry-*_*Ry- 8

sharp最近有一些人气,但它与*Magick绑定的想法相同.

但是,必须安装ImageMagick/GraphicsMagick进行简单的图像调整大小对我来说似乎太过分了

图像大小调整绝非易事.JPEG格式特别复杂,有几种方法可以使用不同质量的结果来缩放图形,很少有这些方法可以轻松实现.存在图像处理库来完成这项工作,所以如果没有其他原因你无法安装它们,那就去做吧.

  • 也许我是一个懒惰的开发人员,但是当我看到ImageMagick的安装过程并想知道我将花多少钱在我的Amazon AWS EC2实例上安装它时,我立即开始寻找其他选项 - 特别是考虑到我需要的只是能够为缩略图调整图像大小. (12认同)

小智 6

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
Run Code Online (Sandbox Code Playgroud)