已经做的
下面谈一谈水印,因为具体工作没有涉及过,恰好离职在家,就简单的做了一下Wwmark(What Watermark), 或许有些浅显。水印(Watermark),顾名思义,给某些东西加上如同water一样的mark,但并不影响源文件的使用。水印分类的话,简单来分的可以有图片水印,视频水印,文件水印,网页水印。添加的水印可以是有图片也可以有文字。从可见与否来分,又可以分为明水印和盲水印。盲水印在CTF中常见的隐写术有一些,但不完全一样。关于图像本身的RGBA和RGB此时暂时不讲(因为PIL和OpenCV在处理文件时存储的格式不一样),只是简单的讲一讲我是怎么做的。鉴于输入源定义为视频和文件,很容易的就选型了FFMPEG和OpenCV。 采用ffmpeg进行图像和视频的明水印处理。当然使用命令行可能更加快捷,但不利于复用。
1 | ffmpeg -i input.mp4 -i image.png -filter_complex "[0:v][1:v] overlay=x=10:y=10" -c:a copy output.mp4 |
针对文字水印和图片水印ffmpeg提供了drawtext
和overlay
两种方式。
此处wwmark.py做了简要的封装(基于ffmpeg-python),使其能够支持不同文件的明暗水印加密。针对pdf时采用的方法是pdf2image,然后image加上水印再合成为pdf。
此处有三个小问题需要注意:
一是文件路径,建议采用tempfile.TemporaryDirectory()
。
二是针对生成的文件名,需要进行排序,默认是使用的uuid.uuid1()
做的文件名生成,再随后的合成和排序中会出现问题,此处简单更改为lambda x: x+1
自增加一。
三是图片合成为pdf的时候会多一个首页。因为是ims[0].save(self.o_file, "PDF", resolution=100.0, save_all=True, append_images=ims[1:])
所以需要把append_images
改为从第二张图片开始。
至于写水印时,在对图片的处理时建议采用统一的格式,比如把输入全部转成png格式再输出为png。因为不同文件的图像通道不一样。。。
1 | with tempfile.TemporaryDirectory() as temp: |
同时针对其他的一些小bug,比如ffmpeg默认是overwrite为false的,作为ffmpeg-python的library,当你output为quiet时,此时就会导致程序报错而不知道怎么回事,需要强制设置为true.
一些测试效果图:
原图:
水印图:
盲水印图:
解压后的水印:
至于明水印,由于是采用ffmpeg overlay去做的,所以位置的控制完全在于Overlay的写法,overlay
本身基础的有x
,y
,即坐标。其后还有enable=between(t, xxxx,yyy)
,可以针对视频repeat fream.
而对于图像本身的透明效果,不像drawtext
可以直接设置alpha=0.4
这种格式, 0.4代表了百分之40,而是需要采用colorchannelmixer
,去控制aa
的值。
这是40%透明度的效果
理想中的
拥有多格式多水印选项,具备完善的数据分级和权限控制,以及日志和追踪的功能。特性来说,需要有自动植入和一键追溯更优。
实际上的
一些听到的吐槽
- 业务方接入姿势不一,即接入结果不对
- 接入后数据采集姿势不对,即接入结果不对
- 追溯时数据不对,即接入姿势不对
- 追溯时权限和环境难以触达,即接入姿势不对