0

0

Node+UDP实现图片裁剪功能

青灯夜游

青灯夜游

发布时间:2021-03-10 10:13:17

|

1808人浏览过

|

来源于csdn

转载

本篇文章给大家介绍一下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服务器。

短视频去水印微信小程序
短视频去水印微信小程序

抖猫高清去水印微信小程序,源码为短视频去水印微信小程序全套源码,包含微信小程序端源码,服务端后台源码,支持某音、某手、某书、某站短视频平台去水印,提供全套的源码,实现功能包括:1、小程序登录授权、获取微信头像、获取微信用户2、首页包括:流量主已经对接、去水印连接解析、去水印操作指导、常见问题指引3、常用工具箱:包括视频镜头分割(可自定义时长分割)、智能分割(根据镜头自动分割)、视频混剪、模糊图片高

下载

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.height
		fs.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部分就先省去。。。

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

178

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

35

2026.01.28

ao3中文版官网地址大全
ao3中文版官网地址大全

AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

79

2026.01.28

php怎么写接口教程
php怎么写接口教程

本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。

2

2026.01.28

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

4

2026.01.28

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

8

2026.01.28

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

24

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

122

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

72

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
swoole入门物联网开发与实战
swoole入门物联网开发与实战

共15课时 | 1.2万人学习

swoole项目实战(第二季)
swoole项目实战(第二季)

共15课时 | 1.2万人学习

swoole从入门到精通(第一季)
swoole从入门到精通(第一季)

共47课时 | 3.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号