Node+UDP实现图片裁剪功能

本篇文章给大家介绍一下nodejs+udp实现图片裁剪功能的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

Node+UDP实现图片裁剪功能

相关推荐:《nodejs 教程》

说起来UDP,可能最吸引人的就是【UDP服务器】了吧。

UDP服务器可以用于一些特殊数据的(高效)传输,例如图片、视频和音频信息等

我见过一些大佬用UDP来和C++ server交互,主要目的就是希望将PHP无法处理的逻辑业务,通过UDP服务器发送给其他server来处理。

所以,能不能有这样一个需求:我们有两个服务器A、B,我们希望A处理所有的业务逻辑,而B只去做数据库操作(比如更新)。

有多个设计思想可以解决上面的问题,最简单的就是通过HTTP发送请求的方式,将A处理后的参数通过HTTP方式传递给B服务器,然后B服务器获取参数后更新数据库。 —— 这种方式对于Node.js 来说非常简单,但是HTTP是一个TCP协议,对于我们自己的两台可信赖的服务器,我们更希望使用UDP来传送协议,避免TCP中不必要的数据传输。

接下来我们要介绍的一个应用,就是使用Node.js来处理图片上传切割(图片处理),并通过客户端显示所有的经过处理后的图片列表,而这个功能也将应用UDP模块来实现。

应用分析

本应用包含两个部分,一个是图片上传的Web服务功能模块、图片处理后的页面展示功能;另外一个则是图片的处理,主要是图片的切割保存。而作为用户,希望是这样的一个工具,上传一个图片,并指定其需要切割的长和宽,通过系统处理后返回给用户一个切割好的图片,并通过页面返回展示。

根据以上的需求的分析,我们将上面的需求转化为如图4-5所示的系统运行流程图。根据应用的分析,我们会设计两个服务器,一一个是Web服务器,另外一个则是图片处理服务器,两者通过UDP协议进行交互:
应用分析结构
图片上传页面,主要是图片的上传和预览功能页面;图片展示页面,展示通过图片处理后返回的图片; HTTP Web服务器主要的作用是文件上传和图片展示;图片处理服务器,将Web服务器的数据通过UDP协议传递给图片处理服务器,图片处理服务器做-定的处理后返回相应的数据到Web服务器。

UDP Server端实现 —— 图片处理服务器

根据上面的分析,本应用需要实现的3个功能模块分别是,UDP Server端、UDP Client端(Web Server) 和Jade页面。
那么首先我们从该应用的UDPServer端代码实现原理开始介绍(也就是图片处理服务器)。图片处理服务器作为UDP的server端,要应用UDP模块实现UDP server, 由于该UDP server依赖图片处理工具,因此在UDP服务程序中会应用github中的一个开源Node.js图片处理工具一node -imagemagick来辅助实现图片处理功能。根据上面的分析,我们简单设计出UDP Server的代码框架,代码如下:

const dgram=require('dgram');   //UDPconst server=dgram.createSocket("udp4");server.on("message",function(msg,rinfo){//监听消息事件后处理})server.on("listening",function(){var address=server.address();console.log("server listening "+address.address+":"+address.port);})server.bind("监听端口号");

登录后复制

会发现,UDP其实似乎和socket.io差不多?都是采用的监听消息流机制。而http没有这样做,所以几乎不用http去做这些高交互的事情 —— 这固然和他们的内部实现有关。

监听完了,该干正事了:我们需要一个函数去处理图片。这个函数的触发时间要在事件流之后:

npm install imagemagick

登录后复制

需要注意的是,在使用该工具时,必须安装imagemagick-cli系统工具软件:sudo apt-get install imagemagick –fix-missing(否则会在运行期间抛出异常)

/**url:图片源路径width:图片压缩宽height:图片压缩高newName:图片处理后存储路径**/function resizeImage(url,width,height,newName,callback){var im=require('imagemagick');im.resize({srcPath: url,dstPath: newName,width: width,height: height}, function(err,stdout,stderr){if(err){callback(-1);}else{callback(stdout);}})}

登录后复制

然后在udp的onmessage回调函数中调用:

server.on("message",function(msg,rinfo){var imageObject=JSON.parse(msg);resizeImage(imageObject.url, imageObject.width, imageObject.height, imageObject.new_name, function(ret){var retJson;if(ret==-1){retJson={'code':-1,'msg':'some error in resize image','data':{}}}else{retJson={'code':0,'msg':'success','data':{'name':imageObject.new_name}}}//将json对象转为json字符串var retStr=JSON.stringify(retJson);//转为buffer对象,用于UDP传输var message=new Buffer(retStr);server.send(message,0,message.length,rinfo.port,rinfo.address);})})

登录后复制

server.on(“message”,callback(msg, rinfo))回调函数中有msg和rinfo参数,其中msg为客户端发送的消息数据,而rinfo则为客户端信息,服务器端根据客户端信息中的端口port和IP地址address, 应用server.send响应数据到客户端即可。到这里我们就实现了一个图片处理的UDP服务器,接下来介绍Web服务器端是如何与其交互的。

UDP Client端 —— 前台服务器

npm install express jade formidable body-parser

登录后复制

const jade=require('jade');const express=require('express');const bodyParser=require('body-parser');const fs=require('fs');const VIEW=__dirname+"/view/";var app=express();app.set('view engine','jade');app.use(bodyParser.urlencoded({extended: true}))app.get('/',function(req,res,next){//http响应文件上传页面res.render(VIEW+'index.jade');};//文件上传处理逻辑app.post('/upload',function(req,res,next){var now=Date.parse(new Date())/1000;var form=new formidable.IncomingForm(),fields=[],baseName=__dirname+'/uploadFile/'+now,imageName=baseName+'.png',   //源图片路径newName=baseName+'_small'+'.png',   //新文件路径pathName='/uploadFile/'+now+'_small'+'.png';form.on('field',function(field,value){fields.push([field,value]);});form.parse(req,function(error,fields,files){var size=''+fields.width+'x'+fields.heightfs.renameSync(files.image.path,imageName);imageResize(fields.width, fields.height, imageName, newName,res);})};app.listen('监听端口号');

登录后复制

form.parse(request, [callback]) 该方法会转换请求中所包含的表单数据,callback会包含所有字段域和文件信息

登录后复制

文件上传功能同样是应用formidable 模块,当然这里还应用到其获取POST数据的方法。formidable 模块提供了获取field参数的API form.on的field 事件,监听POST数据传递。所有的POST数据都需要应用form.parse 进行解析,解析返回fields对象和文件对象files。根据获取的width和height,调用imageResize对图片进行相应的压缩处理。

然后去实现imageResize函数:imageResize函数的主要功能是应用UDP模块连接UDPServer,将相应的参数数据转化为json字符通过UDP协议传递到UDPServer,并将UDPServer响应的数据通过res.render直接返回显示到相应的页面

function imageResize(width,height,imagePath,newName,res){var imageJson={'width':width,'height':height,'url':imagePath,'new_name':newName};var jsonStr=JSON.stringify(imageJson);var client=dgram.createSocket("udp4");var message=new Buffer(jsonStr);client.send(message,0,message.length,Server端监听的端口号,"域名",function(){client.on("message",function(msg,rinfo){var retJson=JSON.parse(msg);if(retJson.code===0){res.render(VIEW+'main.jade',{'url':pathName,'err':'ok'});}else{res.render(VIEW+'main.jade',{'url':'','err':'error'});}})})}

登录后复制

前端模板jade部分就先省去。。。

更多编程相关知识,请访问:编程视频!!

以上就是Node+UDP实现图片裁剪功能的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2717112.html

(0)
上一篇 2025年3月7日 22:01:17
下一篇 2025年3月7日 08:06:39

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 总结Nodejs开发中常用的一些模块

    本篇文章给大家介绍一下一些nodejs开发中常用的模块。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 收集了NodeJS开发中常用的一些模块。 MVC框架 – Express Express 是轻量灵活的No…

    2025年3月7日
    200
  • socket.io如何即时通信前端配合Node

    本篇文章给大家详细介绍一下socket.io即时通信前端配合node的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 首先看效果,哈哈哈 还是那么的小 首先我们需要 新建文件夹 并快速生成一个package.json…

    2025年3月7日 编程技术
    200
  • 如何升级或修改nodejs的版本

    本篇文章给大家介绍一下升级或修改nodejs的版本的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 升级或者修改nodejs的版本 有时候我们需要被迫的升级或者降级nodejs的版本,这个时候就问题来了,怎么弄呢,总…

    2025年3月7日
    200
  • Node.js如何实现断点续传

    本篇文章给大家介绍一下实现node.js断点续传的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 平常业务需求:上传图片、Excel等,毕竟几M的大小可以很快就上传到服务器。针对于上传视频等大文件几百M或者几G的大小…

    2025年3月7日
    200
  • 什么是Deno?与Node.js的区别是什么?

    deno是为解决node的一些内在问题而创建的,那么与node.js的区别是什么?下面本篇文章带大家详细了解一下deno,介绍一下deno和node.js的区别。 【推荐学习:《nodejs 教程》】 Node.js的作者Ryan Dahl…

    2025年3月7日
    200
  • 什么是KOA框架?详解实现koa2的四大模块

    koa是一个基于node实现的一个新的web框架,本篇文章给大家介绍一下koa2框架,带大家理解和实现一个koa框架需要实现四个大模块。 什么是koa框架? koa是一个基于node实现的一个新的web框架,它是由express框架的原班人…

    2025年3月7日
    200
  • Node版本管理工具–nvm-windows的使用方法(windows环境)

    如何降低node.js的版本?本篇文章给大家介绍一下node版本管理工具–nvm-windows的安装,以及使用nvm-windows来管理node版本,进行版本切换的方法。 由于业务需求需要降低node的版本,但是网上找了一大…

    2025年3月7日 编程技术
    200
  • node文件怎么写成npm包并发布出去?

    node文件怎么写成npm包?下面本篇文章给大家介绍一下把node文件拷贝写成npm包并发布出去的方法,希望对大家有所帮助! 把node文件拷贝写成npm包,并发布 npm插件发布 发布npm其实是一件很简单的事情,只是因为长时间不发布会忘…

    2025年3月7日
    200
  • 手把手教你使用工具切换 node 版本

    本篇文章给大家介绍一下怎么使用工具切换 node 版本,让 node 版本更贴合项目的需要,防止报错。有一定的参考价值,希望对大家有所帮助! 之前都没有接触过需要切换 node 版本的情况,直到有一天,运行一个项目,出现报错:Referen…

    2025年3月7日
    200
  • 浅谈如何手动配置 node_modules 中的依赖包

    如何手动配置 node_modules 中的依赖包?下面本篇文章给大家介绍一下利用patch-package 修改 node_modules 中依赖包的方法,希望对大家有所帮助! 首先,问题是这样发生的,在项目中使用pdfvuer第三方插件…

    2025年3月7日 编程技术
    200

发表回复

登录后才能评论