「Node.js」图片操作之“多媒体顶流”不羁的一生

简介: 用技术实现梦想。今天分享Node.js中图片操作的知识点。

前言

图片作为多媒体“顶流”之一,本文主要解锁node对图片处理的各种操作,同时收获乐趣和技能。

随波逐流无归处,乘风破浪济沧海。


常规操作

node-images

操作图片前先介绍一下使用到的图片处理库-node-iamges,它是Node.js轻量级跨平台图像编解码库。


功能特性

  • 轻量级:无需安装任何图像处理库。
  • 跨平台:Windows下发布了编译好的.node文件,下载就能用。
  • 方便用:jQuery风格的API,简单可依赖。


安装

npminstallimages


注意

  • 如果使用过程中遇到报错:dyld: lazy symbol binding failed: Symbol not found,可以查看一下node版本,node版本需要16.14.0。(问题issues


获取图片属性

  • .size([width[, height]]):获取或者设置图像宽高,如果height未指定,则根据当前宽高等比缩放;
  • .width([width]):获取或设置图像宽度,如果未指定值则获取图像宽度,否则设置图像宽度;
  • .height([height]):获取或设置图像高度,如果未指定值则获取图像高度,否则设置图像高度;
constimages=require('images');
constwidth=images('compose-bg-2.jpeg').width();
constheight=images('compose-bg-2.jpeg').height();
constproperties=images('compose-bg-2.jpeg').size();
console.log(width); // 1080console.log(height); // 1339console.log(properties); // { width: 1080, height: 1339 }


裁剪图片

裁剪图片主要用到三个API

  • images(image[, x, y, width, height]):从另一个图像中复制区域来创建图像
  • .resize(width[, height]):设置图像宽高,如果height未指定,则根据当前宽高等比缩放, 默认采用 bicubic 算法;
  • .save(file[, type[, config]]):编码并保存当前图像到 file ,如果type未指定,则根据 file 自动判断文件类型,config为图片设置,目前支持设置JPG图像质量
constimages=require('images');
images(images('compose-bg-2.jpeg'), 0, 889, 1080, 450).resize(540).save('compose-bg-region.jpg');

最终截取了原图片compose-bg-2.jpeg的底部并根据resize的值进行等比缩放生成新图片compose-bg-region.jpg

image.jpeg


合成图片

draw为node-images提供的绘制API,可以设置绘制到的图片上的位置

  • .draw(image, x, y):在当前图像( x , y )上绘制 image 图像
constimages=require('images');
images('compose-bg.jpg').draw(images('compose-text.jpg'), 709, 14).save('compose-new.jpg', {
quality: 100, //保存图片到文件,图片质量为100});

将图片B绘制到图片A上最终得到了合成图片,可以应用于某些加文案或者水印的场景。

image.jpeg

旋转图片

  • .rotate(angle):将当前图像旋转,在参数中规定角度;
  • 介绍页面没有展示rotateAPI,单独源码中test文件中有这个API,我试验了一下,好使;
constimages=require('images');
// 顺时针旋转90度images('compose-bg-2.jpeg').rotate(90).save('compose-rotate-90.jpg', {
quality: 100, //保存图片到文件,图片质量为100});
// 顺时针旋转270度,即逆时针旋转90度images('compose-bg-2.jpeg').rotate(270).save('compose-rotate-270.jpg', {
quality: 100, //保存图片到文件,图片质量为100});


image.jpeg

“顶流”不一样的人间烟火

送你一颗小红心

  • 选一张图片,作为最终合成的图片的背景图;
  • 左半颗红心,使用rotate顺时针旋转90度,变成垂直状态;
  • 左半颗红心,使用draw绘制到背景图上,绘制点为(100, 200);
  • 右半颗红心,使用rotate顺时针旋转90度,变成垂直状态;
  • 右半颗红心,使用draw绘制到背景图上,绘制点为(300, 200);
  • 使用save保存最终的图片;
constimages=require('images');
constbg=images('compose-bg-2.jpeg');
constleft=images('compose-heart-left.png');
constrignt=images('compose-heart-right.png');
bg.draw(left.rotate(90), 100, 200).draw(rignt.rotate(90), 300, 200).save('compose-heart-new.jpg', {
quality: 100, //保存图片到文件,图片质量为100});

最终合成的图片

image.jpeg


头像裁剪

  • 头像裁剪,选择一张图片,设置裁剪后宽度和高度,使用resize可以重置图片尺寸;
  • 宽度和高度可以只设置其中一项,另一项会取该项的值;
  • 设置可剪裁的最大尺寸,因为图片裁剪不可以设置比原图片更大的尺寸,否则报错;
constimages=require('images');
/** * 可裁剪的图片最大宽高 一般不能超过原图片本身的宽高 * @param {number} maxWidth 最大宽度 * @param {number} maxHeight 最大高度 */images.setLimitMax=function (maxWidth, maxHeight) {
images.maxHeight=maxHeight;
images.maxWidth=maxWidth;
returnimages;
};
// 设置可裁剪宽高的最大值images.setLimitMax(800, 800);
/** * 头像裁剪 * @param {string} img 需要裁剪的原图片 * @param {number} width 裁剪后的宽度 * @param {number} hight 裁剪后的宽度 */functiontailorUserAvatar(img, width, hight) {
if (width>images.maxWidth||hight>images.maxHeight) {
thrownewError('宽高不能超过已设置的图片可裁剪宽高的最大值');
  }
// 宽度和高度只设置一项时,另一项取该项的值constwidthNew=width||hight;
consthightNew=width||hight;
// 剪裁之后图片名constpathName=`avatar-${widthNew}-${hightNew}.jpg`;
// 剪裁并保存新图片images(img).resize(widthNew, hightNew).save(pathName);
}
tailorUserAvatar('avatar.jpg', 300);


image.jpeg

如果设置超过原尺寸600*600的尺寸,程序会抛出错误

tailorUserAvatar('avatar.jpg', 1000);


image.jpeg


总结

小技巧探索的差不多了,后面我会用Node开发实际项目,尽管目前业务上没有需要,但是有备无患。



目录
相关文章
|
2月前
|
前端开发 JavaScript API
使用 JavaScript 实现图片上传
使用 JavaScript 实现图片上传
102 1
|
1月前
|
JavaScript 前端开发
Vue、ElementUI配合Node、multiparty模块实现图片上传并反显_小demo
如何使用Vue和Element UI配合Node.js及multiparty模块实现图片上传并反显的功能,包括前端的Element UI组件配置和后端的Node.js服务端代码实现。
25 1
Vue、ElementUI配合Node、multiparty模块实现图片上传并反显_小demo
|
1月前
|
JavaScript 前端开发
【原创】用JavaScript动态获取网页中缩放图片的长度、宽度和显示比例
【原创】用JavaScript动态获取网页中缩放图片的长度、宽度和显示比例
|
1月前
|
前端开发 JavaScript
node接收前端上传的图片,单文件、多文件同name、多文件不同name
本文介绍了在Node.js中使用multer模块接收前端上传的图片,包括单文件上传、多文件上传(同name和不同name)以及任意类型文件上传的方法。
46 0
|
2月前
|
JavaScript 前端开发
JS - 如何上传 Base64 编码的图片
本文展示了如何将Base64编码的图片在前端转换为Blob对象,并使用`FormData`上传到服务器端的方法。
166 0
|
2月前
|
JavaScript
js之图片上传
js之图片上传
73 0
|
3月前
|
移动开发 运维 JavaScript
阿里云云效操作报错合集之遇到Node.js的内存溢出问题,该怎么办
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
3月前
|
JavaScript Shell 应用服务中间件
阿里云云效操作报错合集之Node.js构建报错,该如何排查问题
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
3月前
【node】图片验证码(svg-captcha)
【node】图片验证码(svg-captcha)
180 0