nodejs第三方库sharp对图片的操作生成新图片、压缩、添加文字水印及图片水印等
Sharp是一个基于libvips的高性能Node.js图像处理库,它提供了广泛的功能,包括调整大小、裁剪、旋转、格式转换等。Sharp可以处理多种图像格式,并且能够高效地转换图像格式。
相关说明及用法看:https://sharp.nodejs.cn/
安装:Sharp:npm install sharp
以及安装:npm install --save text-to-svg
text-to-svg将文本转换为SVG路径,而无需本地依赖,相关用法及说明看https://www.npmjs.com/package/text-to-svg
上代码
const sharp=require('sharp');
const fs=require('fs');
const textToSvg=require('text-to-svg');const basePicture=`${__dirname}/img/123.jpg`;//转化Buffer流对象,并将buffer流合并成一个,并期约返回
function streamToBuffer(stream)
{return new Promise((resolve,reject)=>{const bufferList=[];//图片流数据stream.on('data',data=>{bufferList.push(data);})stream.on('error',err=>{reject();})//end为追加数据stream.on('end',()=>{//这里是合并buffer对象resolve(Buffer.concat(bufferList));})})
}//生成新图片,并追加新图片的格式大小覆盖区域等
function dealWithStream(basePicture)
{const readableStream=fs.createReadStream(basePicture);const transformer=sharp().resize({width:100,height:100,fit:sharp.fit.cover,position:sharp.strategy.entropy})//console.log(transformer);//将transformer流数据追加进行处理readableStream.pipe(transformer);streamToBuffer(transformer).then(function(newPicBuffer){//写入新图片中fs.writeFile(`${__dirname}/img/water.png`,newPicBuffer,function(err){if(err){console.log(err);return;}console.log('done');})})}//dealWithStream(basePicture);
//将图片转为jpeg,并对jpeg文件进行处理
function dealWithBuffer(basePicture)
{sharp(basePicture).resize(800,600,{fit:sharp.fit.inside,withoutEnlargement:true}).toFormat('webp').toBuffer().then(function(outputBuffer){fs.writeFile(`${__dirname}/img/3.webp`,outputBuffer,function(err){if(err){console.log(err);return;}console.log('done');})})
}//dealWithBuffer(basePicture);
//添加文字水印
function addText(basePicture,font,newFilePath)
{const {fontSize,text,color,left,top}=font;const textToSvgSync=textToSvg.loadSync();const attributes={fill:color};const options={fontSize,anchor:'top',attributes};const svgTextBuffer=Buffer.from(textToSvgSync.getSVG(text,options));//添加文字sharp(basePicture).composite([{input:svgTextBuffer,top,left}]).withMetadata() // 在输出图像中包含来自输入图像的所有元数据(EXIF、XMP、IPTC)。.toFormat('webp') //生成新的图片格式为webp.toFile(newFilePath) .then(info=>{if(!!info){console.log('水印已经生成');}}).catch(err=>{console.log(err);})
}/*
addText(basePicture,{fontSize:24,text:'喜气洋洋',color:'white',left:200,top:200
},`${__dirname}/img/6.webp`);
*///添加图片水印,水印图片一定要小于原图
function addWatermark(basePicture,watermarkPicture,newFilePath)
{sharp(basePicture)//.rotate(180) //旋转180度.composite([{input:watermarkPicture,blend:'overlay',globalAlpha:0.5,left:50,top:50 }])//在左上坐标(10,10)位置添加水印图片,composite为合成图片.withMetadata().webp({quality:90}).toFile(newFilePath).then(result=>{if(result){console.log('水印已经添加');}}).catch(err=>{console.log(err);})sharp.cache(false);
}//dealWithStream('./img/300.jfif');
let waterPic=`${__dirname}/img/water.png`
addWatermark(basePicture,waterPic,'./img/7.webp');
相关文章:
nodejs第三方库sharp对图片的操作生成新图片、压缩、添加文字水印及图片水印等
Sharp是一个基于libvips的高性能Node.js图像处理库,它提供了广泛的功能,包括调整大小、裁剪、旋转、格式转换等。Sharp可以处理多种图像格式,并且能够高效地转换图像格式。 相关说明及用法看:https://sharp.nodejs.cn/ 安装&#…...
力扣第 67 题 “二进制求和”
题目描述 给你两个二进制字符串 a 和 b,以二进制字符串的形式返回它们的和。 示例 1: 输入: a "11", b "1" 输出: "100"示例 2: 输入: a "1010", b "1011" 输出: "10101"提示: 每个字符串仅由…...
Spring Boot优雅读取配置信息 @EnableConfigurationProperties
很多时候我们需要将一些常用的配置信息比如oss等相关配置信息放到配置文件中。常用的有以下几种,相信大家比较熟悉: 1、Value(“${property}”) 读取比较简单的配置信息: 2、ConfigurationProperties(prefix “property”)读取配置信息并与 …...
鸿蒙多线程开发——Sendable对象的序列化与冻结操作
1、Sendable对象的序列化与反序列化 Sendable对象的简单介绍参考文章:鸿蒙多线程开发——线程间数据通信对象03(sendable) 与JSON对象的序列化和反序列化类似,Sendable对象的序列化和反序列化是通过ArkTs提供的ASON工具来完成。 与JSON类似࿰…...
nodepad配置c/c++ cmd快速打开创建项目文件
前提:下载MinGw,并且配置环境变量 点击阅读次篇文章配置MinGw 无论是哪个编译器,执行c文件都是经历以下步骤: 编译文件生成exe文件执行该exe文件 我们先手动完成这两部 手动编译文件使用指令 gcc {你的c文件} -o {生成文件名}生成exe文件 第二步运行exe直接点击该文…...
【C++】读取数量不定的输入数据
读取数量不定的输入数据 似乎是一个很实用的东西? 问题: 我们如何对用户输入的一组数(事先不知道具体有多少个数)求和? 这需要不断读取数据直至没有新的输入为止。(所以我们的代码就是这样设计的&#x…...
ESC字符背后的故事(27 <> 033 | x1B ?)
ANSI不可见字符转义,正确的理解让记忆和书写变得丝滑惬意。 (笔记模板由python脚本于2024年11月26日 15:05:33创建,本篇笔记适合python 基础扎实的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free…...
基于NXP LS1043 OpenWRT智能交通边缘网关设计
0 引言 城市公共交通是与人们生产生活息息相关的重 要基础设施,是关系国计民生的社会公益事业。“城 市公共交通发展的十三五规划”明确指出:建设与移 动互联网深度融合的智能公交系统;推进“互联网 城市公交”发展;推进多元…...
绪论相关题目
1.在数据结构中,从逻辑上可以把数据结构分成( C)。 A. 动态结构和静态结构 B. 紧凑结构和非紧凑结构 C. 线性结构和非线性结构 D. 内部结构和外部结构 2.在数据结构中,从存储结构上可以将之分为( B)。 A. 动态结构和静态结构 B. 顺序存储和非顺序存储 C. 紧凑结构和非紧…...
中国科学院大学研究生学术英语读写教程 Unit7 Materials Science TextA 原文和翻译
中国科学院大学研究生学术英语读写教程 Unit7 Materials Science TextA 原文和翻译 Why Is the Story of Materials Really the Story of Civilisation? 为什么材料的故事实际上就是文明的故事? Mark Miodownik 1 Everything is made of something. Take away co…...
centos系列安装服务器时分区
服务器安装手动分区,标准分区(注意顺序): 自定义标准分区 /boot/efi 200M;/boot 1G 放引导程序和内核文件及根文件; /var 磁盘1/10内存尽量大存放日志文件; /usr 磁盘1/10内存尽量大存在程序软件包; swap 虚…...
vue的理解
什么是vue vue是一套用于构建用户界面的渐进式框架,与其他框架不同的是,vue被设计为可以自底向上逐层应用,它也是创建单页面应用的web应用框架。vue的核心库只关注视图层,不仅易上手,还便于与第三方库或既有项目整合。…...
111. UE5 GAS RPG 实现角色技能和场景状态保存到存档
实现角色的技能存档保存和加载 首先,我们在LoadScreenSaveGame.h文件里,增加一个结构体,用于存储技能相关的所有信息 //存储技能的相关信息结构体 USTRUCT(BlueprintType) struct FSavedAbility {GENERATED_BODY()//需要存储的技能UPROPERT…...
抖音短视频矩阵源代码部署搭建流程
抖音短视频矩阵源代码部署搭建流程 1. 硬件准备 需确保具备一台性能足够的服务器或云主机。这些硬件设施应当拥有充足的计算和存储能力,以便支持抖音短视频矩阵系统的稳定运行。 2. 操作系统安装 在选定的服务器或云主机上安装适合的操作系统是关键步骤之一。推…...
leetcode - LRU缓存
什么是 LRU LRU (最近最少使用算法), 最早是在操作系统中接触到的, 它是一种内存数据淘汰策略, 常用于缓存系统的淘汰策略. LRU算法基于局部性原理, 即最近被访问的数据在未来被访问的概率更高, 因此应该保留最近被访问的数据. 最近最少使用的解释 LRU (最近最少使用算法), 中…...
计算机网络八股整理(一)
计算机网络八股文整理 一:网络模型 1:网络osi模型和tcp/ip模型分别介绍一下 osi模型是国际标准的网络模型,它由七层组成,从上到下分别是:应用层,表示层,会话层,传输层,…...
了解 CSS position 属性
CSS position 属性 在前端开发中,布局是一个至关重要的部分,而 CSS 的 position 属性是控制元素在页面中位置的核心工具。 本文将解释 CSS 中的 position 属性,包括其不同的值、效果及典型使用场景,以帮助你更好地理解和应用这一…...
数据结构 【二叉树(上)】
谈到二叉树,先来谈谈树的概念。 1、树的概念及结构 树是一种非线性的数据结构,它的逻辑关系看起来像是一棵倒着的树,也就是说它是根在上,而叶子在下的, 在树这种数据结构中,最顶端的结点称为根结点。在树的…...
C++11(中)
C11(中) 1.可变参数模板1.1.使用场景 2.lambda表达式(重要)2.1.使用说明2.2.函数对象与lambda表达式 3.线程库3.1.thread3.2.atomic原子库操作3.3.mutex3.3.1.mutex的种类3.3.2.lock_guard3.3.3.unique_lock 🌟&#x…...
下拉选择器,选择框,支持单选、多选、筛选和清空功能,支持vue2和vue3
下拉选择器,选择框,支持单选、多选、筛选和清空功能,支持vue2和vue3https://ext.dcloud.net.cn/plugin?id8159 点击即可。 注意数据来源: 选择的:valueName:选择下拉选择显示的显示屏...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
