基于watermark.js给图片添加水印

本文详细介绍了如何使用watermark.min.js文件为图片添加水印,包括文件导入方式、参数设置及错误处理等关键步骤,为开发者提供了一种简单实用的水印添加方案。

 依赖watermark.min.js文件

import watermark from "../../asset/watermark.min.js";

/***
 *fileUrl 文件地址
 *callBack 回调函数
 **/
function addWatermark(fileUrl, callBack) {
    // upperLeft左上;lowerLeft左下;upperRight右上;lowerRight右下;center:居中
	watermark(['' + fileUrl + ''])
       .image(watermark.text.lowerRight('水印名称', '36px serif', '#000')).then((img) => {
		  callBack(img);
	   }).catch(function(error) { //加上catch 
	    console.log(error);
	});
},

 

<think>好的,我现在需要帮助用户找到使用Node.js批量为图片添加水印的方法或代码示例。首先,我需要回想一下用户提供的引用内容,看看是否有相关的信息。引用1提到了Node-ImageMagick-Native,这是一个原生的Node.js接口的ImageMagick库,可能适合处理图片水印。引用3提到了Fluent-ffmpeg,这也是一个视频处理库,但可能也支持图片处理。用户的问题是关于图片的,所以可能这两个引用都有用。 接下来,我需要确定使用哪个库更合适。ImageMagick本身是一个强大的图像处理工具,通常用于图片编辑,包括添加水印。而ffmpeg虽然主要用于视频,但也可以处理图片,尤其是批量处理。所以这两个库都可以考虑。 然后,我应该考虑如何编写代码示例。对于Node-ImageMagick-Native,可能需要安装并调用其API来合成图片水印。而Fluent-ffmpeg可能需要使用drawtext滤镜来添加文字水印,或者使用overlay滤镜添加图片水印。另外,用户提到的是批量处理,所以代码中需要包含遍历文件目录的部分,例如使用fs模块读取目录中的文件,然后循环处理每个文件。 另外,需要注意水印的位置、透明度、字体大小等参数,这些在代码示例中需要体现出来。同时,要确保用户安装相应的依赖,比如ImageMagick软件本身,或者ffmpeg的可执行文件。 还要考虑错误处理,比如在读取文件或处理过程中可能出现的异常,应该用try-catch块来捕获,并给出提示。另外,性能方面,批量处理可能需要异步操作或并行处理,但为了简单起见,可能先使用同步方法,再提示用户可以使用异步优化。 最后,根据用户提供的引用,需要正确标注引用来源,比如引用1和引用3。同时,生成相关问题,帮助用户进一步了解其他方法或优化技巧。</think>### Node.js批量添加图片水印方法 根据提供的引用内容,以下是两种基于Node.js的批量图片水印实现方案: #### 方案一:使用ImageMagick-Native(推荐) ```javascript const im = require('imagemagick-native'); const fs = require('fs'); const path = require('path'); // 配置水印参数 const watermarkConfig = { watermarkPath: 'watermark.png', // 水印图片路径 outputDir: './output', // 输出目录 opacity: 50, // 透明度百分比 position: 'southeast' // 水印位置(northwest, north, northeast, west, center, east, southwest, south, southeast) }; // 批量处理函数 async function batchAddWatermark(inputDir) { const files = fs.readdirSync(inputDir); files.forEach(file => { try { const inputPath = path.join(inputDir, file); const outputPath = path.join(watermarkConfig.outputDir, file); const image = im.convert({ srcData: fs.readFileSync(inputPath), quality: 100, composite: [{ input: watermarkConfig.watermarkPath, compose: 'over', gravity: watermarkConfig.position, opacity: watermarkConfig.opacity + '%' }] }); fs.writeFileSync(outputPath, image); console.log(`已处理: ${file}`); } catch (err) { console.error(`处理失败: ${file}`, err); } }); } // 使用示例 batchAddWatermark('./input_images').catch(console.error); ``` 特点说明: - 支持PNG透明水印叠加 - 可自定义9种定位方式 - 通过opacity参数控制透明度 - 依赖ImageMagick底层库(需预先安装)[^1] #### 方案二:使用Fluent-ffmpeg(视频/图片通用) ```javascript const ffmpeg = require('fluent-ffmpeg'); const fs = require('fs'); // 文字水印添加示例 function addTextWatermark(input, output) { return new Promise((resolve, reject) => { ffmpeg(input) .complexFilter([ { filter: 'drawtext', options: { text: '© Your Copyright', fontfile: 'arial.ttf', fontsize: 24, fontcolor: 'white@0.5', x: 'w-text_w-10', y: 'h-text_h-10' } } ]) .output(output) .on('end', resolve) .on('error', reject) .run(); }); } // 批量处理 async function processBatch(inputDir) { const files = fs.readdirSync(inputDir); for (const file of files) { if (/\.(jpg|png)$/i.test(file)) { const input = path.join(inputDir, file); const output = path.join('./output', file); await addTextWatermark(input, output); } } } ``` 特点说明: - 支持文字/图片两种水印模式 - 可精确控制水印坐标 - 支持动态计算位置(如相对右下角定位) - 需要预先安装ffmpeg[^3] §§常见问题解答§§ 1. **水印位置如何精确定位?** 两种方案都支持坐标定位: - ImageMagick使用gravity参数预定义位置 - ffmpeg支持像素级坐标计算,如`x='w-tw-10'`表示右对齐偏移10像素 2. **如何处理透明PNG水印?** 推荐使用ImageMagick方案,其composite命令天然支持透明度混合,通过opacity参数可控制整体透明度 3. **性能优化建议** - 使用worker_threads实现并行处理 - 设置合理的并发数量(建议CPU核心数×2) - 预先调整图片尺寸统一规格 4. **如何添加动态水印(如时间戳)?** 可使用ffmpeg的drawtext滤镜配合动态文本: ```javascript text: '%{localtime\\:%Y-%m-%d %H\\\\\\:%M\\\\\\:%S}' ``` [^1]: ImageMagick-Native提供原生接口实现高效图像合成 [^3]: Fluent-ffmpeg支持通过滤镜链实现复杂视频/图片处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值