node图片处理工具gm的使用:图片水印、图片验证码、图片裁剪示例

2024-06-10 04:48

本文主要是介绍node图片处理工具gm的使用:图片水印、图片验证码、图片裁剪示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

请在这里查看示例 gm示例

安装

GraphicsMagick和ImageMagick的区别

  • GraphicsMagick是从ImageMagick中分离出来的,推荐下载ImageMagick
  • 加载GraphicsMagick(大小4.72 MB)
    var gm = require('gm')

  • 加载ImageMagick(大小23.8 MB)
    var gm = require('gm').subClass({imageMagick: true})// 注意使用的区别

  • 除了加载有区别,其他使用方式完全一样

window版本

  • 下载imagemagick的window版本(在页面靠下方),如图:
    这里写图片描述
  • 双击exe文件,进行安装,安装过程中要注意勾选以下选项
    这里写图片描述

linux版本(ubuntu 16.04)

  • ubuntu 安装imagemagick

要点

图片水印

var gm = require('gm').subClass({imageMagick: true})gm('./public/images/a.png')// 原图路径
.font('./fonts/zhulangyingxingti.ttf')// 配置逐浪硬行体字库路径
.drawText(10, 10, '水印')
.write('./public/images/b.png', function (e) {// 输出的图片路径if(e) {console.log(e.message)}else {console.log('done')}
})

drawText()中文乱码

  • 字体文件使用中文名称命名,运行时会报错,所以不要使用中文命名
    这里写图片描述
  • 如果确保字库引入正确,还出现中文乱码,那一定是字库文件本身有问题,换一种字库就可以了
  • 尝试过字库格式ttf、otf均支持
    详见:
    字库ttf和otf格式有什么区别?

图片验证码

  • 准备一张背景杂乱的图片和艺术字体的英文字库
    这里写图片描述
  • index.html

    <img src="/gm/captchaAdd"><!-- 前端通过img标签请求验证码 -->
  • app.js

    var express = require('express')
    var session = require('express-session')
    ...var cap = {// 通过函数随机出一个验证码对象,包括文字和在杂乱背景上的位置(这里假如如下)text: 'ab12',pos: [20, 50],
    }// 生成验证码
    app.all('/gm/captchaAdd', function(req, res, next) {var url = './public/images/'+(''+Math.cap()).replace('.', '')+'.png'// 设置验证码的输出路径,且给一个随机文件名gm('./lib/images/captchaBg.png')// 一张背景杂乱的图片作为验证码的背景.font('./lib/src/SelfRighteousness-Regular.ttf')// 一种略艺术的英文字库.fontSize(50)// 设置字体大小.drawText(cap.pos[0], cap.pos[1], cap.text)// 写入随机的验证码.crop(100, 40, cap.pos[0], cap.pos[1])// 将相应的文字部分裁剪出来,作为验证码.noise(1// 加入噪点.write(url, function (e) {// 随机一个文件名,并输出验证码if(e) {console.log(e.message)}else {req.session.captcha = cap// 将验证码对象写入session,用来登录时跟用户输入的作比较res.download(url)// 这里用download方法发送图片,前端千万不能用ajax方式请求}})
    })// 用户登录
    app.all('/user/login', function(req, res, next) {if(req.body.captcha.toLocaleLowerCase() != req.session.captcha.text.toLocaleLowerCase()) {res.send({message: '验证码不正确'})}else {...}
    })
  • 效果如下
    1. 这里写图片描述 2. 这里写图片描述 3. 这里写图片描述
  • 最后可以通过AI开放平台提供的文字识别技术来测试机器识别的效果
  • 升级版验证码(参考慕课网)
    • 用户使用某个用户名尝试登陆,如果错误,将给该用户名在数据库记录一次错误
    • 该用户名错误次数达到3次,要求需等待半小时后才能再次尝试登录该用户名,且必须输入验证码
    • 所以当用户来到登录页面时,在输入用户名之后(或从cookie拿到记录的用户名),需要发送一个请求去验证此用户名是否需要输入验证码,如需要,将验证码输入框显示出来
    • 这个有个问题就是,其他用户可以通过故意错误的登录某些用户名,来使这些用户名永远处于等半小时的状态,导致永远无法登陆(不过为了用户安全,牺牲一点用户体验也是值得的)

详见:
使用session实现一次性验证码

头像裁剪

  • 下面我给出4种方式的思路
  • 方式1(本篇提供的demo即使用此方法)
    • 前端使用上传插件Webuploader来提供上传图片的功能
    • 前端使用Jcrop来提供裁剪的位置
    • 后端使用gm根据给出的裁剪位置对上传的图片进行裁剪
  • 方式2(可以借助jquery-plugins/h5Crop/插件,该插件我会继续完成)
    • 前端利用canvas实现裁剪和压缩,将处理后的base64传给后端
    • 后端将base64转化成图片,返回给前端进行展示
  • 方式3
    • 前端把图片传给后端
    • 后端压缩处理过之后,返回给前端(附带图片唯一标识)
    • 前端使用Jcrop获取图片的裁剪位置,将裁剪位置和图片唯一标识传给后端
    • 后端对对应的图片进行裁剪
  • 方式4(这个需要借助我的另一个裁剪插件,提供了2种方式进行裁剪,效果跟qq裁剪头像一样,以后会开源)
    • 前端裁剪
      • 前端通过js对图片进行平移、缩放操作
      • 再通过canvas的drawImage方法绘制操作后的图片
      • 再通过canvas的toDataURL进行压缩同时获取最终的base64
      • 传base64到后端,后端转为图片,返回图片路径,前端进行展示
    • 后端裁剪
      • 前端通过js对图片进行平移、缩放操作
      • 将操作后获取的裁剪参数(裁剪框的大小、缩放的比率、压缩的比率)和图片文件一同传给后端
      • 后端对上传的文件进行裁剪,返回图片路径,前端进行展示
    • 需使用到的ImageMagick小细节
      • 读取本地图片资源gm('upload\\temp\\crop\\20180601\\49076530-6584-11e8-9542-0d60dcc7daa8.jpg'))
      • 读取外链图片资源gm('http://localhost:3000/upload/temp/crop/20180601/49076530-6584-11e8-9542-0d60dcc7daa8.jpg'))
      • 读取base64图片资源'inline:' + 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBD...')(注意不适用超过5000个字符的base64字符串,否则会转换失败)
      • 为了解决base64过长时ImageMagick处理会失败,我们使用node来转换base64为图片
      • 缩放图片传入百分比gm('xxx.png').resize('50%'))
      • 压缩图片传入值gm('xxx.png').quality(50))
      • 不管是前端canvas压缩还是后端ImageMagick压缩,最后的输出的格式都要是jpeg或jpg,否则压缩后的大小很可能会变大
    • 效果展示(动图较大,请耐心等待)
      这里写图片描述
  • 优缺点对比
    • 方式1:后端只要写1个接口(Webuploader对图片可以进行压缩)
    • 方式2:兼容性IE>=10,减少后端工作量
    • 方式3:适中,后端需要写2个接口(上传图片接口和裁剪图片接口)
    • 方式4:编写复杂,但是扩展性好,可自由选择一种方式

参考

gm官方文档
nodejs图片处理工具gm用法
nodejs gm drawText使用(中文、字体、大小及颜色)
ImageMagick常用操作

这篇关于node图片处理工具gm的使用:图片水印、图片验证码、图片裁剪示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1047254

相关文章

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

前端CSS Grid 布局示例详解

《前端CSSGrid布局示例详解》CSSGrid是一种二维布局系统,可以同时控制行和列,相比Flex(一维布局),更适合用在整体页面布局或复杂模块结构中,:本文主要介绍前端CSSGri... 目录css Grid 布局详解(通俗易懂版)一、概述二、基础概念三、创建 Grid 容器四、定义网格行和列五、设置行

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

基于Python打造一个全能文本处理工具

《基于Python打造一个全能文本处理工具》:本文主要介绍一个基于Python+Tkinter开发的全功能本地化文本处理工具,它不仅具备基础的格式转换功能,更集成了中文特色处理等实用功能,有需要的... 目录1. 概述:当文本处理遇上python图形界面2. 功能全景图:六大核心模块解析3.运行效果4. 相

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll