图片添加水印和截屏功能都是项目中经常用到的。微博的图片默认会加上一个自己id水印,虽然大部分情况下都是由后端加上的,但也有一些场景是需要App自己添加上去的。苹果手机截图是Home键+关机键同时按下,截取的是整个屏幕,能否让用户截取部分呢?
一、图片添加水印
水印一般是文字或图标,它的作用就是告诉用户图片从哪个地方来的(即版权)。图片上加水印的做法很简单,就是图片和水印在屏幕上渲染后,把上下文中所有内容合成生成一张新的图片。
1.1. 位图上下文
如果要生成一张图片,也会用到一个上下文。但和之前的图形上下文不一样,这里用到的是位图上下文,并且是需要手动开启的。开启位图上下文并指定尺寸,尺寸决定着生成的图片尺寸。
注意:手动开启的上下文,一定要手动关闭。
流程:
- 手动开启一个位图上下文;
- 把内容绘制到上下文;
- 从上下文中生成一张新的图片(新的图片尺寸和上下文尺寸一样)
- 关闭上下文
1.2. 示例
场景:图片上添加一个文字水印。
ViewController.m
1 | @interface ViewController () |
效果:
开启上下文除了上面示例提到的一种方法,还有另外一种方法。
1 | /* |
opaque
是不透明度,YES
代表不透明,NO
代表透明。
scale
默认是0.0,但指的是跟随设备主屏幕的scale
,即0.0 == [UIScreen mainScreen].scale
。
二、裁剪
图片的裁剪和生成图片类似。裁剪图片的时候应该先设置裁剪区域,再绘制图片,否则图片已经画上去就不能裁剪了。
2.1. 裁剪圆形图片
ViewController.m
1 | @interface ViewController () |
效果:
注意:addClip
仅对后面添加的内容有效,已经绘制到上下文中的内容不会被裁减。
2.2. 裁剪有边框的图片
带边框的图片本质就是背景一个有颜色的实心圆(大圆),再画一个裁剪路径(小圆),把图片绘制到上下文,最后生成的图片就是带边框的圆形裁剪图片。
ViewController.m
1 | @interface ViewController () |
效果:
三、截屏
view上面的元素之所以能够显示出来,主要是layer层。所以如果想要截屏,就把layer层上面的内容渲染到上下文中,然后从上下文中获取图片(即生成一张图片)即可。
关键代码:[layer renderInContext:ctx]
。
示例:
场景:把上面的控制器截屏生成一张图片。
ViewController
1 | - (void)viewDidLoad { |
效果(到桌面查看):
注意:UIGraphicsBeginImageContextWithOptions
和UIGraphicsBeginImageContext
的区别使用,在截屏的时候建议使用前者。
四、图片自定义区域裁剪和清除
利用手势可以保留区域内的图片,也可以利用手势删除图片一部分内容。
4.1. 自定义区域裁剪
思路:
位图上下文大小是整个imageView控件的大小,裁剪区域设为手势滑动过的遮罩层,再把imageView上的所有内容都渲染到当前位图上下文中,然后再从上下文获取最新图片就行了。
UI构建:
示例:ViewController.m
1 | @interface ViewController () |
效果:
4.2. 自定义区域清除
思路:
和裁剪类似,当imageView渲染到上下文后,按照指定区域把上下文一部分清除就行了。
UI构建:和4.1一样
关键代码:CGContextClearRect(ctx, self.maskView.frame);
示例:ViewController.m
1 | @interface ViewController () |
效果:
注意:上面的这种擦除方式仅仅作为对比和了解,实际开发过程中会使用贝塞尔曲线绘制路径,等待全部接收后再生成图片。