设计出图后经常需要改下尺寸放在别的项目上使用,每次都是设计手工处理,其实图片服务可以做更多事情,比如借助强大的im,可以通过url控制图片尺寸

 var childProcess = require('child_process')
var path = require('path')
,http = require('http')
,fs = require('fs') const dns_host = 'xxx.net' //图片源站地址
const PATH_IMGS = '/home/work/demo/images' //目录存放
const PATH_IMG_TMP = '/home/work/demo/images' //临时目录
//图片尺寸参数
// /pic/_hd/cd/19/d6d821de10662d5352ff2d6bbaf2_960_420.cj.100x100x15.jpg
const REG_RESIZE_OPT = /\.(\d+)?x(\d+[\!\>\<]?)?x(\d+)?\.jpg/
//图片质量 默认85
// /pic/_hd/cd/19/d6d821de10662d5352ff2d6bbaf2_960_420.cj.q100.100x100x15.jpg
const REG_QUALITY_OPT = /\.q(\d+)\.jpg/ //图片质量参数 http.createServer(function(req, res) {
var imgurl = req.url
,cdn_path = imgurl
var options = cdn_path.match(REG_RESIZE_OPT )
var img_suffix = path.extname(cdn_path)
var opt_img = {}
if (options){
opt_img =
{
"width" : options[1] || ''
,"height" : options[2] || ''
,"mode" : options[3] | 0 || 1
,"imgurl" : imgurl
}
cdn_path = cdn_path.replace(REG_RESIZE_OPT, img_suffix)
} options = cdn_path.match(REG_QUALITY_OPT)
if (options) {
opt_img.quality = options[1] | 0
cdn_path = cdn_path.replace(REG_QUALITY_OPT, img_suffix)
}
opt_img.quality = opt_img.quality || 85
if (opt_img.quality >= 100) delete opt_img.quality http.get('http://' + dns_host + cdn_path , function(response){
//因为图片size变了 去掉content-length
delete response.headers['content-length']
res.writeHead(response.statusCode , response.headers)
if (200 !== response.statusCode) return response.pipe(res) var file_tmp = path.resolve(PATH_IMG_TMP , 'tmp_' + (+new Date).toString(24) + (img_suffix || ''))
//抓取远程图片 临时存图
var writeStream = fs.createWriteStream(file_tmp)
response.pipe(writeStream) writeStream.on('error' ,function(err){
console.log('err' , err)
res.end(err.toString())
}) response.on('end' ,function(err){
imgWorker(file_tmp , opt_img , (err ,imgsrc) => {
if (err) return res.end(err.toString())
imgsrc = imgsrc || file_tmp
var read_stream = fs.createReadStream(imgsrc)
read_stream.pipe(res)
read_stream.on('end' ,function(){
fs.unlink(file_tmp)
})
})
}) })
}).listen(8791) //web服务端口 function mkdirp(p){
p = path.dirname(p)
if (fs.existsSync(p)) return p = p.split('/')
var pathnow = ''
p.forEach(function(pi){
pathnow += pi + '/'
if (!fs.existsSync(pathnow) ) fs.mkdirSync(pathnow)
}) } function imgWorker( file_tmp ,opt ,cbk){
opt = opt || {} const bindPath = '/usr/local/ImageMagick/bin/'
var bindIdentity = bindPath + 'identify' /*
* mode 0 等比
* mode 1 剪切
* mode 2 压缩填充
* */
if (!opt.height) opt.mode = 0 convert() function convert(){
var binConvert = bindPath + 'convert'
var img_save_path = PATH_IMGS + opt.imgurl
mkdirp(img_save_path)
/*
convert -resize 1024 file.jpg newfile.jpg
得到图片宽为1024,高根据原始图片比例计算而来 convert -resize x768 file.jpg newfile.jpg
得到的图片高位768,宽根据原始图片比例计算而来 convert -resize 1024×768! file.jpg newfile.jpg
固定宽高缩放,不考虑原是图宽高的比例,把图片缩放到指定大小。 convert -resize “1024×768>” file.jpg newfile.jpg
只有当src.jpg的宽大于1024或高大于768时候,才进行缩小处理,否则生成newfile.jpg和file.jpg具有一样的尺寸。 convert -resize “1024×768<” file.jpg newfile.jpg
只有当src.jpg的宽小于1024或高小于768时候,才进行放大处理,否则生成newfile.jpg和file.jpg具有一样的尺寸。 http://www.imagemagick.org/discourse-server/viewtopic.php?t=18545 */ var childArgs = [] /*
* NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast
* NorthWest是左上角对齐 ,SouthEast是右下角对齐
* 通过resize参数第二位可以控制对应对齐方式 默认Center 居中
*/
if (opt.mode) {
var _m = opt.mode.toString()
var gravity = ['NorthWest', 'North', 'NorthEast', 'West'
, 'Center', 'East', 'SouthWest', 'South', 'SouthEast']
[(_m.slice(1,2) || 4) | 0]
var color = ['' ,'white' ,'black'][(_m.slice(2,3) || 0) | 0]
opt.mode = _m.slice(0,1) | 0
}
switch (opt.mode){
case 2:
/*
* mode为2x 图片压缩填入指定尺寸 底色填充
* you can resize to the larger dimension and then pad the image
* convert image -resize "275x275" -gravity center -background white -extent 275x275 resultimage
*/
childArgs.push('-resize')
childArgs.push(opt.width + 'x' + opt.height )
childArgs.push('-gravity')
childArgs.push(gravity)
if (color) {
childArgs.push('-background')
childArgs.push(color)
} childArgs.push('-extent')
childArgs.push( opt.width + 'x' + opt.height )
break
case 1:
/*
* mode为1x 图片拉伸 溢出剪切
*/
var cut = '+0+0'
childArgs.push('-resize')
childArgs.push(opt.width + 'x' + opt.height + '^')
childArgs.push('-gravity')
childArgs.push(gravity) childArgs.push('-crop')
childArgs.push( opt.width + 'x' + opt.height + cut ) break
default:
/*
* 原图等比例缩放 比例不符合时以原图为准
*/
var opt_size = opt.width || ''
if (opt.height) opt_size += 'x' + opt.height
if (opt_size){
childArgs.push('-resize')
childArgs.push(opt_size)
}
}
//去除元数据 相机信息 ps信息等
childArgs.push('+profile')
childArgs.push('"*"')
childArgs.push('-strip') if (opt.quality){
childArgs.push('-quality')
childArgs.push(opt.quality)
} childArgs.push(file_tmp)
childArgs.push(img_save_path) console.log(childArgs) childProcess.execFile(binConvert, childArgs, function(err, stdout, stderr) {
err && console.log(err)
cbk(err , img_save_path)
})
} }

node前端是nginx 对处理过的图片就可以直接使用了

 server {
listen 80;
server_name xxx.com; location /favicon.ico {
return 418;
} location / {
root /home/work/demo/images ;
try_files $uri $uri/ @router; }
location @router {
proxy_pass http://127.0.0.1:8791;
}
}

最新文章

  1. 为动态添加的元素,绑定click事件
  2. android nfc中Ndef格式的读写
  3. Mac打开关闭隐藏文件功能
  4. C语言操作符优先级
  5. MAC Java 开发环境配置
  6. 条形码Code128源代码
  7. android 自定义命名空间
  8. Oracle中SQL语句学习五(统计分组语句group by和having)
  9. 让工程师爱上CMM,实现管理于无形 --- 中标软件CMMI L5之路 (2/2)
  10. HDU 5812 Distance
  11. crm维护踩坑记(一)
  12. java的制作&quot;时间账本&quot;
  13. 分布式服务通讯框架XXL-RPC
  14. 排查线上问题常用的几个Linux命令
  15. BZOJ 3613: [Heoi2014]南园满地堆轻絮(二分)
  16. 20175221 2018-2019-2 《Java程序设计》第一周学习总结
  17. 微信小程序——购物车结算
  18. Uncommon Words from Two Sentences LT884
  19. 大量带BPM的跑步歌曲/跑步音乐下载
  20. [原]secureCRT 改变显示宽度

热门文章

  1. BZOJ-3732 Network 图论 最小生成树 倍增
  2. 本地文件SVN和 vs svn 插件的使用!!
  3. Android应用优化之代码检测优化
  4. Oracle---显式游标
  5. chrome打开控制台状态下,没有人为打断点,自动进入断点模式的解决方法
  6. 图片全屏轮播插件poposlides
  7. Android 从imageview中获得bitmap的方法
  8. spring中quatz的多定时任务配置图文详解
  9. 互联网的大数据神话——NoSQL
  10. Python基础:编码