阿里云 OSS 图片水印
1、参考资料
2、前言
最近无意间发现博客被盗,完完全全复制粘贴,不仅标注了原创,没有标注原文链接,搞得像是他自己写出来的一样,我发私信让他加上原文链接,他好像是个瞎子外加聋哑人👏👏👏好家伙,我 TM 直接好家伙
大学期间的昵称叫 Heygo(黑狗),女票给取的,前段时间家里出了点事情,在网上查一下,黑狗是抑郁症代表词语,丘吉尔有一句名言:“心中的抑郁就像只黑狗,一有机会就咬住我不放。”丘吉尔之后,黑狗(blackdog)便成了英语世界中抑郁症的代名词
感觉 Heygo 这个名字不太吉利,还是改回初中高中的昵称:Oneby,有次英语课上老师叫我们挨个(one by one)读单词,听着很像用四川方言喊我的名字,于是就有了这个绰号。于是就决定了,水印内容为【Oneby’s Blog】
3、阿里云 OSS 图片水印
利用阿里云 OSS 给图片加水印很简单,只需要在图片 URL 的后面跟上一对水印参数就行,具体参数设置可以参照官网
我这里举个栗子:https://heygo.oss-cn-shanghai.aliyuncs.com/images/image-20200529100432557.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,text_T25lYnkncyBCbG9n,size_20,g_center,color_FFFFFF,shadow_100,t_100,g_se,x_15,y_15
,这张图片的水印效果是这样的:
感觉还不错,就用这个参数吧:?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,text_T25lYnkncyBCbG9n,size_20,g_center,color_FFFFFF,shadow_100,t_100,g_se,x_15,y_15
。其具体含义为:
- 水印文字字体为文泉驿正黑:
type_d3F5LXplbmhlaQ
(d3F5LXplbmhlaQ
是文泉驿正黑经过Base64编码后的值) - 水印内容为“Oneby’s Blog”:
text_T25lYnkncyBCbG9n
- 水印文字颜色为白色、字体大小为20:
color_FFFFFF,size_20
- 文字阴影透明度为100%:
shadow_100
- 水印透明度为100%:
t_100
- 水印文字位置是右下、水平边距15、中线垂直偏移15:
g_se,x_15,y_15
4、typora-tools 水印功能
哇哦,正则真香,就短短下面几行代码,就实现了图片批量加水印的功能
/**
* @ClassName OSSWaterMarkUtil
* @Description TODO
* @Author Oneby
* @Date 2021/2/5 19:00
* @Version 1.0
*/
public class OSSWaterMarkUtil {
/***
* @description: 给 md 文件中的图片加上水印
* @param: originMdContent 不带图片水印的 md 文件内容
* @return: java.lang.String 加上图片水印后的 md 文件内容
* @author Oneby
* @date: 22:18 2021/2/5
*/
public static String getWaterMarkMdContent(String originMdContent) {
// 图片路径存储格式:![image-20200711220145723](https://heygo.oss-cn-shanghai.aliyuncs.com/Software/Typora/Typora_PicGo_CSDN.assets/image-20200711220145723.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,text_T25lYnkncyBCbG9n,size_20,g_center,color_FFFFFF,shadow_100,t_100,g_se,x_15,y_15)
// 正则表达式
/*
\[.*\]:![image-20200711220145723]
. :匹配任意字符
* :出现0次或多次
\(.+\):(https://heygo.oss-cn-shanghai.aliyuncs.com/Software/Typora/Typora_PicGo_CSDN.assets/image-20200711220145723.png)
. :匹配任意字符
+ :出现1次或多次
(!\[.*\]) 为 $1,(\(.+) 为 $2
*/
String regex = "(!\\[.*\\])(\\(.+)\\)";
// 执行正则表达式
Matcher matcher = Pattern.compile(regex).matcher(originMdContent);
String waterMarkMdContent = matcher.replaceAll("$1" + "$2" + OSSConfig.getOSSConfig().getWaterMarkParams() + ")");
return waterMarkMdContent;
}
}
下面来解释下 String regex = "(!\\[.*\\])(\\(.+)\\)"
正则表达式的含义
(!\\[.*\\])
为$1
,用于匹配图片的名称部分![image-20200711220145723]
(\\(.+)
为$2
,用于匹配图片 URL 路径部分(https://heygo.oss-cn-shanghai.aliyuncs.com/Software/Typora/Typora_PicGo_CSDN.assets/image-20200711220145723.png
- 最后还差一个
)
于是我们在 $2
和 )
之间加上图片水印参数即可:执行 matcher.replaceAll("$1" + "$2" + OSSConfig.getOSSConfig().getWaterMarkParams() + ")")
方法就能将无水印的图片替换为有水印的图片,芜湖起飞
注:我在加水印之前就保存了 md 文件的内容,因此本地的图片是没有水印的,之后再将图片添加上水印参数,然后复制到粘贴板中,方便我们去博客上粘贴~~~
代码存在的问题及改进
存在的问题:
阿里云 OSS不支持 Gif 动图添加水印,如果 Gif 动图添加水印,只能处理第一帧,不能处理多帧动画,啊哦~
代码改进:不处理 Gif 动图
/**
* @ClassName OSSWaterMarkUtil
* @Description TODO
* @Author Oneby
* @Date 2021/2/5 19:00
* @Version 1.0
*/
public class WatermarkUtil {
/***
* @description: 给 md 文件中的图片加上水印
* @param: originMdContent 不带图片水印的 md 文件内容
* @return: java.lang.String 加上图片水印后的 md 文件内容
* @author Oneby
* @date: 22:18 2021/2/5
*/
public static String getWaterMarkMdContent(String originMdContent) {
// 图片路径存储格式:![image-20200711220145723](https://heygo.oss-cn-shanghai.aliyuncs.com/Software/Typora/Typora_PicGo_CSDN.assets/image-20200711220145723.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,text_T25lYnkncyBCbG9n,size_20,g_center,color_FFFFFF,shadow_100,t_100,g_se,x_15,y_15)
// 正则表达式
/*
\[.*\]:![image-20200711220145723]
. :匹配任意字符
* :出现0次或多次
\(.+\):(https://heygo.oss-cn-shanghai.aliyuncs.com/Software/Typora/Typora_PicGo_CSDN.assets/image-20200711220145723.png)
. :匹配任意字符
+ :出现1次或多次
(!\[.*\]) 为 $1,(\(.+) 为 $2
*/
String regex = "(!\\[.*\\])(\\(.+)\\)";
// 执行正则表达式
Matcher matcher = Pattern.compile(regex).matcher(originMdContent);
StringBuffer sb = new StringBuffer();
try {
// 如果找到了图片链接,直接干他
while (matcher.find()) {
// group0 是整个正则表达式,也就是说 () 匹配的 group 编号从 1 开始
String picUrl = matcher.group(2);
// 检查图片是否已经是网络 URL 引用,如果已经是网络 URL 引用,则不需做任何操作
Boolean isGif = picUrl.contains("gif");
// 不对 Gif 做任何处理
if(isGif == false){
matcher.appendReplacement(sb, "$1" + "$2" + OSSConfig.getOSSConfig().getWaterMarkParams() + ")");
}
}
// 添加上剩余部分并返回
matcher.appendTail(sb);
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
}
5、CSDN 无法识别水印
CSDN 无法识别阿里云 OSS 图片的水印参数,真的捞。。。带水印参数的图片 URL 地址粘贴进去,水印参数直接被吃掉。。。
就在我觉得这几天白干的时候,我去掘金逛了一圈,发现掘金转存图片时可以识别水印参数,说实话,对 CSDN 有点失望
看来以后我得先去掘金那儿发布,然后把有水印的图片拷贝到 CSDN 中(掘金:我就是个工具人)。
不过话说我的笔记篇幅好像太长,超出了掘金的字数限制,好多笔记都不能在掘金发布。。。今天又尝试了一下,掘金这个字数统计有点迷啊。。。PS:掘金是不能自定义专栏吗?
我又试了好多个平台,都对字数和图片数量有限制,CSDN 在字数和图片数量限制这方面做得还是比较好的。PS:我都想自己买个服务器,搭建一个博客系统了。。。
6、项目 GitHub 地址
图片批量加水印的功能已经添加到了 typora 小工具中:oneby1314/typora-tools