docker实现盲水印

需求背景:

现在很多的学校和政府机构对系统内的照片都会进行溯源,因此很多项目的都会要求下载和给第三方应用图片时要求给盲水印而不是原图。

盲水印是很难被觉察,可以通过一些技术手段检测、还原水印。就比如豆瓣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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Docker是一种开源的容器化平台,它可以帮助开发者将应用程序及其依赖项打包成一个独立的容器,以实现应用程序在不同环境中的快速部署和运行。下面是Docker实现原理: 1. 命名空间(Namespaces):Docker使用Linux的命名空间功能来实现容器之间的隔离。命名空间可以将系统资源(如进程、网络、文件系统等)隔离开,使得每个容器都拥有自己独立的资源视图。 2. 控制组(Control Groups):Docker利用Linux的控制组功能来限制和隔离容器对系统资源的使用。通过控制组,可以对容器分配CPU、内存、磁盘IO等资源,并限制其使用量,以保证容器之间的公平性和稳定性。 3. 联合文件系统(Union File System):Docker使用联合文件系统来构建容器镜像。联合文件系统允许将多个文件系统挂载到同一个目录下,形成一个统一的文件系统视图。这样,Docker可以通过层叠的方式将基础镜像与容器所需的文件系统层叠在一起,实现镜像的高效复用和快速部署。 4. 容器镜像(Container Image):Docker使用容器镜像来打包应用程序及其依赖项。容器镜像是一个只读的模板,包含了运行一个容器所需的文件系统、库文件、应用程序等。通过镜像,可以快速创建和启动多个相同的容器。 5. 容器运行时(Container Runtime):Docker使用容器运行时来管理和执行容器容器运行时负责加载容器镜像、创建容器实例、启动应用程序,并监控容器的运行状态。常见的容器运行时包括Docker Engine、containerd等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值