添加水印的方式
图片上传是添加
图片下载时添加
图片上传是添加的优点:
- 当用户下载图片时可以立即给用户,省去图片下载前需要对图片的修改
图片上传是添加的缺点:
- 当水印变换后,需要将所有图片进行更换,这就需要上传图片是,保存两份图片,一份是原图,一份是水印图
图片下载时添加的优点
- 水印变换后也有没事
图片下载时添加的缺点
- 用户需要等服务器处理好后才能下载,当访问量多时,服务器的压力很大
实现图片上传成功后为其添加水印
注意: 要把原图保存下来,添加水印的照片为用户可下载的图片
使用的插件:JImp
文档:https://github.com/oliver-moran/jimp/tree/master/packages/jimp
插件的使用看文档示例
```javascript const express = require(‘express’); const path = require(‘path’); const Jimp = require(‘jimp’); // 操作图片 const multer = require(‘multer’); // 上传文件的中间件
// 路由 const router = express.Router(); // 默认格式 // const upload = multer({ // dest: path.resolve(__dirname, ‘../public/img’) // })
const storage = multer.diskStorage({
// 储存位置
destination: function (req, file, cb) {
cb(null, path.resolve(__dirname, ‘../../public/img’));
},
// 文件名 默认是没有后缀名的
filename: function (req, file, cb) {
const ext = path.extname(file.originalname);
const timeStamp = Date.now();
const randomStr = Math.random().toString(36).slice(-6);
const filename = ${timeStamp}${randomStr}${ext}
;
cb(null, filename);
},
});
const upload = multer({
storage, // 磁盘存储引擎
// 限制数据得大小
limits: {
fileSize: 1024 1024 3,
},
// 那些文件可以上传
fileFilter: (req, file, cb) => {
cb(null, true);
const extname = file.originalname;
const whitelist = [‘.jpg’, ‘.png’, ‘.gif’];
let istrue = false;
whitelist.forEach((ele) => {
if (extname.includes(ele)) {
cb(null, true);
istrue = true;
} else {
cb(null, false);
}
});
if (!istrue) {
cb(new Error(your ext name of ${extname} is not support
));
}
},
});
// 图片加水印
async function mark(waterPath, originPath, filePath, scale=5, marginProportion=0.01) {
// 读取图片
const [waterImg, originImg] = await Promise.all([Jimp.read(waterPath), Jimp.read(originPath)])
// 计算水印图片的缩放比例
const curScale = originImg.bitmap.width / waterImg.bitmap.width;
waterImg.scale(curScale / scale)
// 计算水印图片显示的位置
const right = originImg.bitmap.width marginProportion;
const bottom = originImg.bitmap.height marginProportion;
const x = originImg.bitmap.width - right - waterImg.bitmap.width; const y = originImg.bitmap.height - bottom - waterImg.bitmap.height;
// 将两张图片混合 originImg.composite(waterImg, x, y, { mode: Jimp.BLEND_MULTIPLY, opacitySource: 0.8, }) // 写入 await originImg.write(filePath) }
// 单个数据
router.post(‘/‘, upload.single(‘img’), async(req, res) => {
const url = /upload/${req.file.filename}
;
// 水印照片的地址
const waterImg = path.resolve(dirname, ‘../../public/img/logo.82b9c7a5.png’)
// 需要保存的路径 这个路径用户可以访问下载图片的
const filePath = path.resolve(dirname, ‘../../down’, req.file.filename);
// 添加水印
await mark(waterImg, req.file.path, filePath);
res.send({
code: 0,
msg: ‘’,
data: url,
});
});
module.exports = router;
```