CNode

Node.js 对图片进行裁切、缩放 (gm)

精华
分享
Kkimady发布于13 年前最后回复8 年前55 回复83975 浏览0 收藏

转载自: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)

Y
yyman001#1·8 年前

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

Z
zhubenjie#3·8 年前

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

M
moonfy#4·8 年前

可以用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(); 这是以坐标截取图片中间的部分,这个模块 完美支持对图片的各种姿势,还可以做模型匹配,对象跟踪,人脸识别,绝对是目前破解某东反爬措施的一大神器

S
soliury#5·13 年前

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

C
chihuohuo#6·13 年前
引用 soliury这个,在win下是不是不能用这个东西?

可以 先要安装GraphicsMagick

U
udctfx#7·12 年前

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 }

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

A
abcdabcd987#8·12 年前

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

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

Z
zjshop#12·12 年前

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

C
ContentCoder#13·12 年前
引用 zjshop有gm剪切的事例吗? 我搞了老半天没搞好

可以参考下这个:

gm(image)  
.resize(options.width, options.height, '^')  
.gravity(options.crop)  
.extent(options.width, options.height)  
.toBuffer(callback);  
C
ContentCoder#14·12 年前

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

S
SnipeV5#15·12 年前
引用 soliury这个,在win下是不是不能用这个东西?

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

K
keinwang#16·12 年前

顶一个

S
shiny#17·12 年前
引用 ContentCoder可以试试 缩略图云,只需简单的发送请求,就可以获得缩略图了。再也不用考虑其他事情了。

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

T
txxxj#18·9 年前

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

M
mjerry#19·13 年前

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

V
vjzning#20·12 年前
引用 udctfxvar gm = require('gm'); app.post('/cut', function(req, res) { var imgPath = req.files.uploadFile...

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

D
DoubleSpout#21·12 年前
引用 ContentCoder可以试试 缩略图云,只需简单的发送请求,就可以获得缩略图了。再也不用考虑其他事情了。

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

A
alsotang#22·12 年前
引用 ContentCoder可以试试 缩略图云,只需简单的发送请求,就可以获得缩略图了。再也不用考虑其他事情了。

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

L
leizongmin#23·12 年前

psb (6).jpeg

J
JerroldLee#24·12 年前

mark

A
a4712020502#25·12 年前

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

X
XadillaX#26·12 年前

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

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

T
think2011#27·12 年前

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

H
hades#28·12 年前
H
hades#30·12 年前
引用 alsotang@hades amazon 的 s3?

@alsotang @.@ 我去研究一下

T
think2011#32·11 年前

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

W
wangshikun2010#33·11 年前

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

T
taoerchun#34·11 年前

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 } 是什么原因啊?

S
shangcloud#35·11 年前

为啥没有收藏功能哩

T
taoerchun#36·11 年前

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

W
wizali#37·11 年前

马克

H
haibinpark#38·10 年前

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

来自酷炫的 CNodeMD

L
leehomeok#39·10 年前

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

Y
youarenode#41·10 年前

可以打水印吗?

L
leehomeok#42·10 年前

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

W
willerce#43·10 年前

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

X
xltank#44·10 年前

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

M
MirrorWang#45·10 年前

学习 自豪地采用 CNodeJS ionic

O
onlyone1221#46·10 年前

mark

M
MirrorWang#47·10 年前

mark From Noder

J
joleye#49·10 年前

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

J
jingsam#50·10 年前

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

参与回复
登录后即可参与回复。登录