iOS——隐形水印的实现和『颜色加深』算法

本文探讨了iOS应用中隐形水印的用途和实现方法,特别是在需要保持界面美观时。通过分析Adobe Photoshop的「颜色加深」混色模式,作者发现并提出了一个接近实际效果的算法。此外,还介绍了在iOS中处理图像添加隐形水印的步骤,并提供了一个开源库用于方便开发。

很多 APP 都在敏感页面有水印,主要为了应对舆情时可以追踪图片来源,一般在水印上都会有员工或用户 ID 和昵称。

image.png

水印的用途总结有亮点:

  1. 追踪来源

  2. 威慑作用

威慑作用是指当用户看到水印时,会自觉避免违法传舆行为。

但是,当不需要威慑作用时,例如,为了保持应用或者图片的美观,显形的水印似乎不是那么必要,这时候可以考虑使用隐形水印。

最近在同事在知乎上看到一种水印。

如下图,表面似乎没有什么水印

image.png

但通过 PS 的混色模式处理后,隐形水印就显示出来了

image.png具体处理方式是

  1. 在原图上图层添加全黑图层

  2. 全黑图层选择『颜色加深』

到此为止,我对 PS 的算法产生了好奇,混色模式是常用工具,但是以前没有注意过公式。

颜色加深混色模式

 


PS 的混色模式,其实是底图和混色层的每个像素点,经过一系列计算后得到的结果层。

翻阅了一系列资料后我发现,现有的公式都是不正确的,有些热门文章里也不对。而 PS 官方文档只对几种混色模式进行了介绍,而并没有给出公式。

查看每个通道中的颜色信息,并通过增加二者之间的对比度使基色变暗以反映出混合色。与白色混合后不产生变化。

helpx.adobe.com/cn/photosho…

比较多的是这套公式(是有问题的):

结果色 = 基色-[(255-基色)×(255-混合色)]/混合色

公式中(255-基色)和(255-混合色)分别是基色和混合色的反相。

  1. 若混合色为0(黑色),(基色×混合色)为0,得到的数值为一相个负值,归为0,所以不论基色为何值均为0。

  2. 当混合色的色阶值是255(白色)时,混合色同基色。

基本查到的算法公式都有一个致命问题,公式都标明了,任何颜色和黑色混色结果为黑色,这显然与上文中 PS 处理结果不符合。如果按照这套理论,整个图片都应该黑了。

最后我试出来一个接近的方案是:

  1. 结果色 = 基色 —(基色反相×混合色反相)/ 混合色

  2. 如混色层为黑色,则认为 RGB 为 (255, 255, 255),即非常深的灰色

这个公式可以基本实现 PS 中的颜色加深效果。可以将浅色变深,越浅越深。

隐形水印的实现

 


添加水印

首先介绍 iOS 中的基本图像处理方式:

  1. 获取图片的所有像素点

  2. 改变指针指向的像素信息

+ (UIImage *)addWatermark:(UIImage *)image                     text:(NSString *)text {    UIFont *font = [UIFont systemFontOfSize:32];    NSDictionary *attributes = @{NSFontAttributeName: font,                                 NSForegroundColorAttributeName: [UIColor colorWithRed:0                                                                     &nb
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值