Node.js 使用gm处理图像

现要对之前的文件服务器进行扩展,听网上说gm处理图像来一套一套的。so决定使用该工具去实现文件服务器的图片处理这块。目标有下

现在通过参数去获得缩略图
http://xxx.xxx.com/image/2f696d6167652f75706c6f61642f323031362f31302f31302f313030/0/w/100/h/2100/12/format/jpg/q/75

后面几个参数顺序可以调换如:

http://xxx.xxx.com/image/2f696d6167652f75706c6f61642f323031362f31302f31302f313030/0/format/jpg/q/75/w/100/h/2100

http://xxx.xxx.com/image/2f696d6167652f75706c6f61642f323031362f31302f31302f313030/0/format/jpg/q/75/w/100/h/2100

接口规格

http://file.ttyouni.com/image/hex编码/<mode>/w/<width>/h/<height>/format/<Format>/q/<Quality>

mode参数说明
0:指定高宽缩放(可能变形)
1:指定宽,高按比例(但是如果原图的宽比给定的小的话,则不进行压缩)
2:指定高,宽按比例(但是如果原图的高比给定的小的话,则不进行压缩)
3:指定高宽裁减(不变形)
4:固定(可视为第一种的智能版),将图片按照原始图片的比例为了适应进行按比例缩小,若显示区域偏大则保持原样

其它参数说明

format:新图的输出格式 取值范围:jpg,gif,png,默认为原图格式
q:新图的图片质量 取值范围是[1, 100],默认75。
w: 目标图片的宽度
h:目标图片的高度

接下来是工具。

下载地址:https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/1.3.25/文档地址:http://aheckmann.github.io/gm/docs.html这里的resize的%,@,<,> 符号都没看懂了。希望有缘人解释。 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

时间: 2025-01-14 05:50:31

Node.js 使用gm处理图像的相关文章

玩node-images模块---Node.js轻量级跨平台图像编解码库

Node.js轻量级跨平台图像编解码库 github:https://github.com/zhangyuanwei/node-images Features 功能特性 轻量级:无需安装任何图像处理库. 跨平台:Windows下发布了编译好的.node文件,下载就能用. 方便用:jQuery风格的API,简单可依赖. 我们可以通过这个插件做什么呢,常见的可以加水印,简单的放大缩小压缩处理等. 实例: //编码图片依赖模块https://github.com/zhangyuanwei/node-i

OSChina 开源周刊第三十三期 —— Node.js 和 io.js 准备合作!

每周技术抢先看,总有你想要的! 开源资讯 Node.js 和 io.js 准备合作!合久必分,分久必合? Nervana 开源深度学习软件,性能超 Facebook.Nvidia产品 B 站建开源工作组 多 APP 使用其开源项目 Android 新开发技术 Sky:Dart 开发 Android 应用 谷歌红帽及 VMware 宣布支持 CoreOS 容器 Oracle 宣布 Java 7 生命周期终结 Java 9 公布发行计划,明年 9 月发布正式版 IO.js 2.0.0 发布,服务器

为什么要使用 Node.js

Node.js 是什么 传统意义上的 JavaScript 运行在浏览器上,这是因为浏览器内核实际上分为两个部分:渲染引擎和 JavaScript 引擎.前者负责渲染 HTML + CSS,后者则负责运行 JavaScript.Chrome 使用的 JavaScript 引擎是 V8,它的速度非常快. Node.js 是一个运行在服务端的框架,它的底层就使用了 V8 引擎.我们知道 Apache + PHP 以及 Java 的 Servlet 都可以用来开发动态网页,Node.js 的作用与他们

《基于Node.js实现简易聊天室系列之详细设计》

一个完整的项目基本分为三个部分:前端.后台和数据库.依照软件工程的理论知识,应该依次按照以下几个步骤:需求分析.概要设计.详细设计.编码.测试等.由于缺乏相关知识的储备,导致这个Demo系列的文章层次不是很清楚,索性这一章将所有的过程(前后端以及数据库)做一个介绍,下一章写完总结就OK了吧. (1)前端部分 涉及到的技术:html.css.bootstrap.jquery.jquery UI 登录/注册界面使用的是bootstrap响应式布局,即支持不同尺寸的客户端,以此提高用户的体验.在这之前

为什么应使用 Node.js

为什么应使用 Node.js JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样,现在我们也可以在服务器上运行 JavaScript ,从前端跨越到后端,这样巨大的反差让人难以想象,因为仅仅在几年前 Javascript 还如同 Flash 或者 Java applet 那样嵌入网页在沙箱环境中运行. 在深入Node.js之前,你可能需要阅读和了解使用跨栈式 JavaScript(JavaScript across the s

使用Backbone.js, ExpressJS, node.js, MongoDB的web应用样板工程

这是web应用的一个完整的样板工程,用到了Backbone.js & Marionette, node.js & ExpressJS,MongoDB & Moogoose, Handlebars, Grunt.js, Bower和Browserify! 我建立了一个超级基础的单页面应用程序(SPA),就是一个简单的通讯录管理器, 但麻雀虽小,五脏俱全.我写这篇文章的目的是介绍一下这个应用所用到的整个技术栈:后端,数据,前端,工具和测试.主要包括下面这些技术: 后端: node.js

用Node.js 将bugzilla上的bug列表导入到excel表格里

公司用bugzilla管理产品bug,最近用Node.js做了个东西,方便能够把bug的相关信息导入到excel表格里,好做后续的管理分析. 直接贴代码,写上注释好了.转载请注明出处. var request = require("request") var cheerio = require("cheerio"); var Excel = require('exceljs'); var colors = require("colors"); v

Node.js(转) -- 临时来说还看不懂!

转自:http://blog.jobbole.com/53736/ 本文由 伯乐在线 - Lellansin 翻译.未经许可,禁止转载!英文出处:toptal.欢迎加入翻译组. 介绍 JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样,现在我们也可以在服务器上运行 JavaScript ,从前端跨越到后端,这样巨大的反差让人难以想象,因为仅仅在几年前 Javascript 还如同 Flash 或者 Java applet 那样

为什么我要用 Node.js? 案例逐一介绍

介绍 JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样,现在我们也可以在服务器上运行 JavaScript ,从前端跨越到后端,这样巨大的反差让人难以想象,因为仅仅在几年前 Javascript 还如同 Flash 或者 Java applet 那样嵌入网页在沙箱环境中运行. 在深入Node.js之前,你可能需要阅读和了解使用跨栈式JavaScript(JavaScript across the stack)带来的好处,它统