怎么使用node . js实现图片的动态裁切及算法

  介绍

小编给大家分享一下怎么使用node . js实现图片的动态裁切及算法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

<强>背景,概览

目前常见的图床服务都会有图片动态裁切的功能,主要的应用场景用以为各种终端和业务形态输出合适尺寸的图片。

一张动辄以MB为计量单位的原始大图,通常不会只设置一下显示尺寸就直接输出到终端中,因为体积太大加载体验会很差,除了影响加载速度还会增加终端设备的内存占用。所以要想在各种终端下都能保证图片质量的同时又确保输出合适的尺寸,那么此时就需要根据图片URL来对原始图片进行裁切,然后动态生成并输出一张新的图片。

<强> URL的设计

图片URL需要包含图片id、尺寸,质量等信息。有两种类型的图片URL,分别是原图URL和带动态裁切信息的URL。

//,原图,URL   http://example.com/imgId美元//,带裁切信息的图片,URL   http://example.com/cropType/美元width_ height_质量/美元美元imgId

来分析一下上面URL中的变量:

<李>

美元imgId

<李>

美元cropType

<李>

美元宽度<李>

高美元美元<李>

质量

那么一张图片id为4 b2d4edcc1f82452的原图URL应该是:http://example.com/4b2d4edcc1f82452.jpg

如果想要一张该图800×600的版本,裁切的URL大致是下面这样的:http://example.com/es/800_600_/4b2d4edcc1f82452.jpg

<强>裁切算法

该来说说以URL上背后的算法了。在节点。js中可以使用著名的图片裁切通用库,该库是基于imagemagick和graphicsmagick底层库的封装。

最常见的裁切算法是等比例裁切,等比裁切的算法需要至少给出裁切目标图片的宽度和高度的其中一个,如果图片限宽就给出宽度,限高就给出高度,如果两个参数都有,就需要确保裁切的目标宽高相对于原始的宽高是按比例计算的,否则裁切的结果就会出现拉伸。

var  gm =,要求(& # 39;通用# 39;);//,裁切的最小尺寸   var  minSize =, 48岁;   var  defaultQuality =, 90;/* *   ,*等比例缩放,equal 扩展   {*大敌;@param  String },原文件路径   {*大敌;@param  String },新文件路径   {*大敌;@param  String },缩放规则   {*大敌;@return  promise }   ,*/var  es =,函数(src,桌子,规则),{   return 才能;new 承诺(函数(解决,,拒绝),{   ,,,//,900 _600_90 =祝辞,宽900度/高600度/品质90   ,,,rules =, rules.split (& # 39; _ # 39;);   ,,,if  (rules.length  !==, 3), {   ,,,,,return 拒绝(new 错误(& # 39;Resize  rules 无效# 39;));   ,,,}   ,,,//,解析裁切的目标宽高   ,,,let  resizeWidth =,方法(规则[0]);   ,,,let  resizeHeight =,方法(规则[1]);   ,,,let  quality =,方法(规则[2]),| |,defaultQuality;   ,,,const  readStream =, fs.createReadStream (src);   ,,,const  writeStream =, fs.createWriteStream(桌子);   ,,,通用(readStream)   ,,,,,.size ({   ,,,,,,,bufferStream:真实   ,,,,,},,函数(呃,,大小),{   ,,,,,,,if  (err), {   ,,,,,,,,,return 拒绝(错);   ,,,,,,,}   ,,,,,,,const  origWidth =,宽度;   ,,,,,,,const  origHeight =, size.height;   ,,,,,,,let  resizeResult;   ,,,,,,,//,缩放的宽度和高度做最大最小值限制   ,,,,,,,if  (resizeWidth), {   ,,,,,,,,,if  (resizeWidth 祝辞,origWidth  *, 1.5), {   ,,,,,,,,,,,resizeWidth =, Math.floor (origWidth  *, 1.5);   ,,,,,,,,,}   ,,,,,,,,,else  if  (resizeWidth  & lt;, minSize), {   ,,,,,,,,,,,resizeWidth =, minSize;   ,,,,,,,,,}   ,,,,,,,}   ,,,,,,,if  (resizeHeight), {   ,,,,,,,,,if  (resizeHeight 祝辞,origHeight  *, 1.5), {   ,,,,,,,,,,,resizeHeight =, Math.floor (origHeight  *, 1.5);   ,,,,,,,,,}   ,,,,,,,,,else  if  (resizeHeight  & lt;, minSize), {   ,,,,,,,,,,,resizeHeight =, minSize;   ,,,,,,,,,}   ,,,,,,,}   ,,,,,,,resizeResult =, this.resize (resizeHeight resizeWidth也);   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

怎么使用node . js实现图片的动态裁切及算法