Node.js 使用gm处理图像
现要对之前的文件服务器进行扩展,听网上说gm处理图像来一套一套的。so决定使用该工具去实现文件服务器的图片处理这块。目标有下
现在通过参数去获得缩略图
http://xxx.xxx.com/image/2f696d6167652f75706c6f61642f323031362f31302f31302f313030/0/w/100/h/2100/12/format/jpg/q/75
接口规格
mode参数说明
0:指定高宽缩放(可能变形)
1:指定宽,高按比例(但是如果原图的宽比给定的小的话,则不进行压缩)
2:指定高,宽按比例(但是如果原图的高比给定的小的话,则不进行压缩)
3:指定高宽裁减(不变形)
4:固定(可视为第一种的智能版),将图片按照原始图片的比例为了适应进行按比例缩小,若显示区域偏大则保持原样
其它参数说明
format:新图的输出格式 取值范围:jpg,gif,png,默认为原图格式
q:新图的图片质量 取值范围是[1, 100],默认75。
w: 目标图片的宽度
h:目标图片的高度
接下来是工具。
see the GraphicsMagick docs for details很多方法也没看懂,应该是走了很多复杂的路,贴代码如下,希望路过的指点一二
var fs = require('fs')
, gm = require('gm');
var imageParameter = require('../models/ImageParameter');
exports.createImage = function (oriUrl,descUrl,obj,successFn) {
var outputImage = gm(oriUrl);
var m = imageParameter.getMode();
outputImage.size(function(err, ori) {
//设置图片质量格式
outputImage = outputImage.quality(obj.quantity).setFormat(obj.format);
//调整尺寸
switch(obj.mode){
case m.HW://指定高宽缩放(可能变形)
outputImage = outputImage.resize(obj.width, obj.height,"!");
break;
case m.W://指定宽,高按比例
if(obj.width >= ori.width){
outputImage = outputImage.resize(ori.width, null);
}else{
outputImage = outputImage.resize(obj.width, null);
}
break;
case m.H://指定高,宽按比例
if(obj.height >= ori.height){
outputImage = outputImage.resize(null, ori.height);
}else{
outputImage = outputImage.resize(null, obj.height);
}
break;
case m.CUT://裁剪(不变形)
var toHeight = ori.width;
var toWidth = ori.height;
var x = 0;
var y = 0;
if(ori.width >= obj.width && ori.height >= obj.height){
//以高为基准
if(ori.width/ori.height >= obj.width/obj.height){
toHeight = ori.height;
toWidth = ori.height * obj.width / obj.height;
x= (ori.width -toWidth)/2;
y=0;
}else{
toWidth = ori.width;
toHeight = ori.width * obj.height / obj.width;
x= 0;
y= (ori.height -toHeight)/2;
}
}else{
x = (ori.width - obj.width)/2;
y = (ori.height - obj.height)/2;
toWidth = obj.width;
toHeight = obj.height;
}
outputImage= outputImage.crop(toWidth,toHeight, x, y);
break;
case m.FIT://固定
if(obj.width >= ori.width || obj.height >= ori.height){
outputImage = outputImage.resize(ori.width, ori.height);
}else{
if(obj.width/ori.width > obj.height/ori.height){
outputImage = outputImage.resize(obj.width, null);
}else{
outputImage = outputImage.resize(null, obj.height);
}
}
break;
default:
break;
}
//写入图片
outputImage.write(descUrl, function (err) {
if (!err){
successFn();
}
});
}
);
}
Nodejs文件服务器
http://www.cnblogs.com/chenjianxiang/p/5963011.html
Node.js 使用gm处理图像的更多相关文章
- Node.js 引用 gm 包错误 Error: Could not execute GraphicsMagick/ImageMagick
今天在学习前后台图像剪切时,下载了有图片剪切瑞士军刀之称的 GraphicsMagick. 给 gm.exe 配置了环境变量,在 npm 下好了 gm 的模块,但是运行却出现了错误. 错误如图: [E ...
- 玩node-images模块---Node.js轻量级跨平台图像编解码库
Node.js轻量级跨平台图像编解码库 github:https://github.com/zhangyuanwei/node-images Features 功能特性 轻量级:无需安装任何图像处理库 ...
- Node.js:Buffer浅谈
Javascript在客户端对于unicode编码的数据操作支持非常友好,但是对二进制数据的处理就不尽人意.Node.js为了能够处理二进制数据或非unicode编码的数据,便设计了Buffer类,该 ...
- 用node.js给图片加水印
一.准备工作: 首先,确保你本地已经安装好了node环境.然后,我们进行图像编辑操作需要用到一个Node.js的库:images.这个库的地址是:https://github.com/zhangyua ...
- Node.js与Sails~自定义响应体responses
回到目录 在Node.js里,你可以控制请求和响应,自己可以定义自己的响应方式,如对文本如何响应,对json如何响应,对图像流如何响应等等,而这些在Sails架构里,变得更加容易和清晰了,它位于项目的 ...
- [转]为什么我要用 Node.js? 案例逐一介绍
原文地址:http://blog.jobbole.com/53736/ 介绍 JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样, ...
- 为什么要使用 Node.js
这是一个移动端工程师涉足前端和后端开发的学习笔记,如有错误或理解不到位的地方,万望指正. Node.js 是什么 传统意义上的 JavaScript 运行在浏览器上,这是因为浏览器内核实际上分为两个部 ...
- 【转】为什么我要用 Node.js? 案例逐一介绍
原文转自:http://blog.jobbole.com/53736/ 介绍 JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样, ...
- Node.js Express框架
Express 介绍 Express是一个最小的,灵活的Node.js Web应用程序框架,它提供了一套强大的功能来开发Web和移动应用程序. 它有助于基于Node Web应用程序的快速开发.下面是一 ...
随机推荐
- 使用Windows2003创建DNS服务器 - 进阶者系列 - 学习者系列文章
Windows 2003的DNS服务器的配置还是比较简单的.下面简要介绍下DNS服务器的配置. 1. 打开控制面板,选择 添加删除Windows组件,选择 网络服务 ,选择 详细信息,选择 域名 ...
- WINHTTP的API接口说明
BOOL WINAPI WinHttpAddRequestHeaders( _In_ HINTERNET hRequest, _In_ LPCWSTR pwszHeaders, _In ...
- Linux下PHP开发环境搭建
平时写程序时都是在服务器已经搭建好的PHP环境进行的.出于对未知知识的好奇,这几天在自己的机器上搭建起了PHP开发环境.本想轻松顺利的看到phpinfo显示在我的页面上,没想到安装环境时一路的erro ...
- 手机新闻网站,掌上移动新闻,手机报client,jQuery Mobile手机新闻网站,手机新闻网站demo,新闻阅读器开发
我们坐在地铁,经常来查看新浪手机新闻,腾讯新闻.或者刷微信看新闻更多功能.你有没有想过如何实现这些目标.移动互联网,更活泼. 因为HTML5到,jQuery Moblie到.今天我用jqm为了给你一个 ...
- using和yield return
C#中的using和yield return混合使用 最近写代码为了为了省事儿用了几个yield return,因为我不想New一个List<T>或者T[]对象再往里放元素,就直接返回IE ...
- KMP算法详解-- 转自Matrix67
6 7 8 9 -- A = a b a b 6 7 7 8 9 -- A = a b a b a 5 6 7 8 9 -- A = a b a b a b 6 7 ...
- Binder机制,从Java到C (8. ServiceManager in Native)
在第三篇 Binder机制,从Java到C (3. ServiceManager in Java) 中,讲到ServiceManager的Stub端在Native,Proxy端在Java.实际上,还要 ...
- REDGATE又一好用的脚本工具
REDGATE又一好用的脚本工具 REDGATE又一好用的脚本工具 先说明一下:这个工具是免费的 下载地址:http://www.red-gate.com/products/dba/sql-scr ...
- WCF MSMQ
基于WCF MSMQ 的企业应用解决方案 最近研究了一下基于MSMQ的WCF应用,从书上.网上查了很多资料,但始终没能彻底理解WCF-MSMQ的工作原理,也没能得到一个合理的应用解决方案.索性还是 ...
- SET IDENTITY_INSERT详解
声明:本博文摘自http://www.lmwlove.com/ac/ID500 自增列默认是不能插入显式值的,当我们试图给自增列插入值时,会报以下错误:当 IDENTITY_INSERT 设置为 OF ...