阿里云 OSS 图片水印

阿里云 OSS 图片水印

1、参考资料

  1. 阿里云 OSS 图片水印
  2. Java 正则表达式
  3. 正则表达式中的$1, $2, …的含义
  4. 正则表达式中 的$1,$2

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,这张图片的水印效果是这样的:

image-20210205232129226

感觉还不错,就用这个参数吧:?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。其具体含义为:

  1. 水印文字字体为文泉驿正黑:type_d3F5LXplbmhlaQd3F5LXplbmhlaQ是文泉驿正黑经过Base64编码后的值)
  2. 水印内容为“Oneby’s Blog”:text_T25lYnkncyBCbG9n
  3. 水印文字颜色为白色、字体大小为20:color_FFFFFF,size_20
  4. 文字阴影透明度为100%:shadow_100
  5. 水印透明度为100%:t_100
  6. 水印文字位置是右下、水平边距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. (!\\[.*\\])$1,用于匹配图片的名称部分 ![image-20200711220145723]
  2. (\\(.+)$2,用于匹配图片 URL 路径部分 (https://heygo.oss-cn-shanghai.aliyuncs.com/Software/Typora/Typora_PicGo_CSDN.assets/image-20200711220145723.png
  3. 最后还差一个 )

于是我们在 $2) 之间加上图片水印参数即可:执行 matcher.replaceAll("$1" + "$2" + OSSConfig.getOSSConfig().getWaterMarkParams() + ")") 方法就能将无水印的图片替换为有水印的图片,芜湖起飞


:我在加水印之前就保存了 md 文件的内容,因此本地的图片是没有水印的,之后再将图片添加上水印参数,然后复制到粘贴板中,方便我们去博客上粘贴~~~

image-20210205232716896

代码存在的问题及改进

存在的问题

阿里云 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 地址粘贴进去,水印参数直接被吃掉。。。

image-20210205230617329

就在我觉得这几天白干的时候,我去掘金逛了一圈,发现掘金转存图片时可以识别水印参数,说实话,对 CSDN 有点失望

image-20210205232613294

看来以后我得先去掘金那儿发布,然后把有水印的图片拷贝到 CSDN 中(掘金:我就是个工具人)。

不过话说我的笔记篇幅好像太长,超出了掘金的字数限制,好多笔记都不能在掘金发布。。。今天又尝试了一下,掘金这个字数统计有点迷啊。。。PS:掘金是不能自定义专栏吗?

我又试了好多个平台,都对字数和图片数量有限制,CSDN 在字数和图片数量限制这方面做得还是比较好的。PS:我都想自己买个服务器,搭建一个博客系统了。。。

6、项目 GitHub 地址

图片批量加水印的功能已经添加到了 typora 小工具中:oneby1314/typora-tools

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值