精华 Node.js 对图片进行裁切、缩放 (gm)
发布于 11 年前 作者 kimady 80901 次浏览 最后一次编辑是 8 年前 来自 分享

转载自:http://blog.csdn.net/kidx_/article/details/9709387

GM : GraphicsMagick for node.js 首先得安装 GraphicsMagick 或者 ImageMagick。 然后执行: $ sudo npm install gm

我安装的是ImageMagick,在ubuntu系统下快速安装: $ sudo apt-get install imagemagick

HOW TO USE GM 文档:http://aheckmann.github.io/gm/docs.html 使用ImageMagick var imageMagick = gm.subClass({ imageMagick: true }); 然后就像文档中使用gm那样使用ImageMagick即可(举个例子) imageMagick(“img.png”).resize(300, 100).autoOrient().write(’/path’, callback);

Example (nodejs + Express)

var gm = require('gm')
,  fs = require('fs')
,	imageMagick = gm.subClass({ imageMagick : true });
exports.imgUpload = function(req, res) {
	res.header('Content-Type', 'text/plain');
  var path = req.files.img.path;	//获取用户上传过来的文件的当前路径
  var sz = req.files.img.size;
  if (sz > 2*1024*1024) {
    fs.unlink(path, function() {	//fs.unlink 删除用户上传的文件
      res.end('1');
    });
  } else if (req.files.img.type.split('/')[0] != 'image') {
    fs.unlink(path, function() {
      res.end('2');
    });
  } else {
    imageMagick(path)
    .resize(150, 150, '!') //加('!')强行把图片缩放成对应尺寸150*150!
    .autoOrient()
    .write('public/images/user/'+req.files.img.name, function(err){
      if (err) {
        console.log(err);
        res.end();
      }
      fs.unlink(path, function() {
        return res.end('3');
      });
    });
  }
};

上面只是index.js文件的部分核心代码 点击去下载完整Example

示例运行截图: alt example

可以查看 public/images/user/ 里面的图片,验证你上传的图片是否被缩放了。

同理可对图片进行裁切: gm(“img.png”).crop(width, height, x, y)

详情看gm的文档http://aheckmann.github.io/gm/docs.html

50 回复

分享是不错的顶一下,但是附件csdn这个就要喷一下了,我擦csdn就TM垃圾站,密码泄露事件导致我的邮箱现在经常收到垃圾信息。

这个,在win下是不是不能用这个东西?

可以 先要安装GraphicsMagick

var gm = require(‘gm’);

app.post(’/cut’, function(req, res) { var imgPath = req.files.uploadFile.path; var imgSize = req.files.uploadFile.size; var imgName = req.files.uploadFile.name;

console.log(imgPath); console.log(imgSize); console.log(imgName);

var imageMagick = gm.subClass({ imageMagick : true });

imageMagick(imgPath).resize(150, 150, ‘!’).autoOrient().write(‘public/images/user/’+ imgName, function(err){ if (err) { console.log(err); } });

res.send(‘11’); });

最后打印的err: { [Error: Command failed: Ч - -resize ] code: 4, signal: null }

能不能告诉下,这是为什么呢?

仔细看一下文档,有一个专门做缩略图的函数,可以调整大小和质量

gm("img.png").thumb(width, height, outName, quality, callback)

不过似乎 gm.resize.quality.write 更合适……

跟你遇到同样的问题

有gm剪切的事例吗? 我搞了老半天没搞好

可以参考下这个:

gm(image)  
.resize(options.width, options.height, '^')  
.gravity(options.crop)  
.extent(options.width, options.height)  
.toBuffer(callback);  

可以试试 缩略图云,只需简单的发送请求,就可以获得缩略图了。再也不用考虑其他事情了。

@chihuohuo 在Windows下安装GM后, 例子中始终报 “异常错误!可能不支持该格式的图片。”

正式运营:0.01元RMB/请求 也太贵了吧,类似七牛/upyun/阿里云图像处理之类的成熟方案都没那么高的价格。

@usherwong 怎么都不支持win7 64bit的系统啊。下载下的代码运行和上面的报错一样。

@ContentCoder 七牛可以自由更改图片格式,大小,每月10G空间免费,10G免费流量。。。

@snoopy @shiny @conContentCoder 用七牛爽。现在的云储存服务都会提供图片裁剪了。

ImageMagick 安装在window是上还是要报错啊 求大神解救下 { [Error: Command failed: Ч - -resize ] code: 4, signal: null }

gm 有一个缺点——实际上是通过命令行来的。

最好还是有大神跳出来自己写个扩展什么的吧。

咦,这不是我一年前看到的帖子吗?

@alsotang @snoopy 国外的有啥推荐,用不了国内的。

@alsotang @.@ 我去研究一下

@a4712020502 用graphicmagick,还要再安装Ghostscript。

{ [Error: spawn ENOENT] code: ‘ENOENT’, errno: ‘ENOENT’, syscall: ‘spawn’ },出现这种错误。原来imagemagick是通过brew安装的,不是通过npm安装的,所有才会报错

咦,这不是我两年前看到的帖子吗?

var gm1=require(‘gm’).subClass({ imageMagick : true }); gm1(’/public/images/chat/abc.jpg’) .resize(240, 240,’!’) .noProfile() .write(’/public/images/chat/abc1.jpg’, function (err) { if (!err) console.log(‘done’); else { console.log(err); }

    });
 window下报错:![error.png](//static.cnodejs.org/Fi-uqcEgxURKrMRs7f-ZpLr-mp0F)
 { [Error: Command failed: ������ - /images

] code: 4, signal: null } 是什么原因啊?

为啥没有收藏功能哩

@a4712020502,安装ImageMagick-6.2.7-6-Q16-windows-dll.exe版本试试

@zjshop 我也没弄好啊,主要剪切出来的图片不对。

来自酷炫的 CNodeMD

跟4楼 遇到同样的问题 ,有哪位大神解决了吗?

可以打水印吗?

各位,我想说,我解决了, imageMagick(path)改成 gm(path) 还有要按顺序安装imageMagick 和gm

可以看看另外一个图像处理库 lwip,另外我们对大部分NODE版本做了预编译,npm install 即可。 https://github.com/weixin/node-lwip

简单的缩放可以使用nginx的imagefilter插件,如果想做裁剪,可以使用某个人写的带crop offset的imagefilter插件

问题解决,win7下居然有自带的convert命令,和imageMagick命令冲突

做图片处理,难道没人用sharp这个包么?

安装了imageMagick和GraphicsMagick后,运行gmTest,提示“异常错误!可能不支持该格式的图片。”请问这是咋回事啊?

弱弱问下,使用的这个图片处理库能想ps那样裁剪png多余空白,并算出裁剪图片在原图的x,y坐标吗?我使用别的方法实现了,sharp和jimp(裁剪算法是网上找的)

@yyman001 你好 请问怎么实现的 我也遇到了类似的问题

@joleye @taoerchun 我也遇到了这样的问题。 在 win7下 [Error: Command failed: ��Ч���� 请问你们是如何解决的

可以用opencv4nodejs来做啊,

const cv = require(‘opencv4nodejs’); async function imgCut(){ let waldoMat = await cv.imreadAsync(./data/s9.jpg); let rows = waldoMat.rows; let cols = waldoMat.cols; let x0=19; let y0 = 17; let waldoRect = new cv.Rect(cols/2-x0,rows/2-y0,2x0,2y0); waldoMat = waldoMat.getRegion(waldoRect); cv.imshow(‘We’ve found Waldo!’, originalMat); cv.waitKey(); } imgCut(); 这是以坐标截取图片中间的部分,这个模块 完美支持对图片的各种姿势,还可以做模型匹配,对象跟踪,人脸识别,绝对是目前破解某东反爬措施的一大神器

回到顶部