需求背景:
现在很多的学校和政府机构对系统内的照片都会进行溯源,因此很多项目的都会要求下载和给第三方应用图片时要求给盲水印而不是原图。
盲水印是很难被觉察,可以通过一些技术手段检测、还原水印。就比如豆瓣app,对小组内容进行截图时,截图上将自动生成经加密的截图用户 ID、被截图帖子 ID、截图时间信息,这个信息对于截屏者来说是难以察觉的,水印文字的颜色和背景相似。所以盲水印通常用于一些对保密有需求的场合。
这类盲水印是怎样实现的呢?原理并不复杂,通常是将图片进行离散余弦、小波或者傅里叶变换,得到图片的频谱信息,再将水印的编码信息叠加到图片的频谱上,然后再进行一次逆变换,生成的图片就带有几乎无法检测、但又可以确切还原出来的盲水印了。
技术实现方案
在gitee上有个盲水印的开源项目叫blind_watermark,依赖于Python运行,只需要简单的几行命令,就可以为图片添加文字或者另一张图作为盲水印。该项目对打了盲水印的图片反转、裁剪、遮挡、涂抹等处理,水印依然可以被算法还原出来。
现在我这边是用docker容器部署的java项目,需要在java中调用pyton脚本。
之前我是用dockerfile文件部署的,从openjdk:8-jre拉去的镜像,但运行该容器时发现里面的系统不是传统的centos或者unbutu,而是一个叫Debian的系统,在这里面装入python环境的时候各种报错而且还要修改镜像源,很麻烦。所有就换了一种思路:基于docker centos镜像,从镜像容量里面安装java环境、python环境、盲水印blind_watermark库;然后将该镜像打包到docker images 中,再编写dockerfile文件基于该镜像库运行java项目。
技术实现步骤
1.首先构建centos镜像,然后运行该镜像容器
#构建centos镜像
docker pull centos:centos7.9.2009
docker run -it --name centos7 -d centos:centos7.9.2009 /bin/bash
2.进入该容器,并安装java环境、python环境、盲水印blind_watermark库
//1.进入容器
docker exec -it 976d37259de4 bash
//2.安装java环境(此命令不需要配置环境变量)
yum -y install java-1.8.0-openjdk*
//查看java是否安装成功
java -version
//3.安装python 环境的依赖
yum -y install gcc automake autoconf libtool make
yum -y install make*
yum -y install zlib*
yum -y install openssl libssl-dev
yum install sudo
//从官网中下载python安装包
cd /usr/local
wget https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tgz
//解压
tar -xvf Python-3.8.12.tgz
//创建python3 文件夹
mkdir python3
//切换到解压后的 Python-3.8.12 目录下
cd Python-3.8.12
//执行如下代码安装
./configure --prefix=/usr/local/python3 --enable-optimizations
make
make install
`//创建软链接
ln -s /usr/local/python3/bin/python3.8 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3`
//查看 Python 3 是否安装成功
python3 -V
pip3 -V
//4.安装盲水印库,这里使用豆瓣加速
pip3 install blind-watermark -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
//创建软链接
ln -s /usr/local/python3/bin/blind_watermark /usr/bin/blind_watermark
//验证盲水印是否安装成功
blind_watermark --help
3.将该容器打包成image镜像文件
docker commit 659121f30dec ycx-centos:7.9
4.编写dockerfile文件
基础镜像
FROM ycx-centos:7.9
# author
MAINTAINER zhouhx
# 挂载目录
VOLUME /home/deploy/docker/ycx_face_store/Server
VOLUME /home/deploy/docker/minio
# 创建目录
RUN mkdir -p /home/deploy/docker/ycx_face_store/Server
RUN touch /home/deploy/docker/ycx_face_store/Server/nohup.log
# 指定路径
WORKDIR /home/deploy/docker/ycx_face_store/Server
# 复制jar文件到路径
COPY ./ycx-face-store-server.jar /home/deploy/docker/ycx_face_store/Server/ycx-face-store-server.jar
#设置时区,这里很重要,为了保证容器内的时间和外面的时间一致
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
# JVM参数
ENV JVM_OPTS="-Dname=ycx-face-store-server -Duser.timezone=Asia/Shanghai -Xms512m -Xmx4096m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"
# 启动认证服务
ENTRYPOINT nohup java ${
JVM_OPTS} -jar ycx-face-store-server.jar --server.port=80 --spring.profiles.active=prod > nohup.log 2>&1
5.编写docker-compose文件
ycx-admin:
container_name: ycx-admin
build:
context: ./ycx_face_store/Server
dockerfile: dockerfile
ports:
- "80:80"
volumes:
//注意,需要把原图的文件夹都一一映射到docker容器中,不然java中执行pyton命令报无权限
- ./ycx_face_store/Server:/home/deploy/docker/ycx_face_store/Server
- /home/deploy/docker/minio:/home/deploy/docker/minio
- /home/deploy/docker/minio/data:/home/deploy/docker/minio/data
- /home/deploy/docker/minio/embed:/home/deploy/docker/minio/embed
- /home/deploy/docker/minio/extract:/home/deploy/docker/minio/extract
//注意:这里是将docker权限以root管理员允许,python中需要该权限
privileged: true
depends_on:
- ycx-redis
- ycx-minio
- ycx-rabbitmq
- ycx-elasticsearch
6.运行
docker-compose up -d ycx-admin
#验证是否启动成功
docker ps
这里就docker部署完成了,java代码中使用hutool的RuntimeUtil调用python命令
RuntimeUtil.execForStr(" blind_watermark --embed --pwd 1234 /home/deploy/docker/minio/data/2055817.jpg "zhouhx" /home/deploy/docker/minio/embed/2055817_watermark.jpg");
//输出以下结果表明加水印成功
{
"flag": true,
"wmShape": 47
}
附原图和水印图
原图:
水印图:
附:python 水印相关命令
//加水印
blind_watermark --embed --pwd 1234 /home/zhouhx/1.jpg "zhouhx" /home/zhouhx/2.jpg
//正常解水印,wm_shape为47是之前加水印返回的结果,这个要一一对应,不然解不出来
blind_watermark --extract --pwd 1234 --wm_shape 47 /home/zhouhx/2.jpg
今天的文章docker实现盲水印分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/9113.html