iOS 中图片水印的使用,今天无意间看到的
2016-01-21 本文已影响1236人
Raybon_lee
先看下解释
// 2D绘图 Quartz2D
// 合并图片 -- 水印(这是我们今天要做的事情,实际上就是将两张图片在一个imageView上重叠显示。但是要求的几点要做到:第一,两张图片要分别在两个线程下载,彼此不耽误事件;第二,要等两个全部下载完成之后再执行合并的操作。合并结束后,第二张图片会成为第一张图片的水印,也就是放在第一张图片的上面)
/**
* 开启位图上下文 方法:
* UIGraphicsBeginImageContextWithOptions(<#CGSize size#>, <#BOOL opaque#>, <#CGFloat scale#>)
* CGSize size:指定将来创建出来的bitmap(位图)的大小
* BOOL opaque:默认为YES,不透明,位图中没有绘制的区域会以黑色显示;NO代表透明,位图中没有绘制的区域会以透明显示(在这里如果透明会显示imageView的backgroundColor);主要是用于绘图时进行性能优化的开关。
* CGFloat scale:代表缩放,0代表系统会自动设置根据当前设备的屏幕因数设置缩放因数。
*/
核心代码:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 1.队列组、全局并发队列 的初始化
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 2.下载图片1
// 在block内部不能修改外部的局部变量,这里必须要加前缀 __block
__block UIImage *image1 = nil;
// 注意这里的异步执行方法多了一个group(队列)
dispatch_group_async(group, queue, ^{
NSURL *url1 = [NSURL URLWithString:@"http://img3.3lian.com/2013/c2/64/d/61.jpg"];
NSData *data1 = [NSData dataWithContentsOfURL:url1];
image1 = [UIImage imageWithData:data1];
});
// 3.下载图片2
__block UIImage *image2 = nil;
dispatch_group_async(group, queue, ^{
NSURL *url2 = [NSURL URLWithString:@"http://fujian.86516.com/forum/201201/05/144226tl2tx1vtx2g2gjol.jpg"];
NSData *data2 = [NSData dataWithContentsOfURL:url2];
image2 = [UIImage imageWithData:data2];
});
// 4.合并图片 (保证执行完组里面的所有任务之后,再执行notify函数里面的block)
dispatch_group_notify(group, queue, ^{
// 开启一个位图上下文(opaque--不透明的)
UIGraphicsBeginImageContextWithOptions(image1.size, YES, 0.0);
// 绘制第一张图片
[image1 drawInRect:CGRectMake(0, 0, image1.size.width * 0.8, image1.size.height)];
// 绘制第二张图片
[image2 drawInRect:CGRectMake(0, image1.size.height - image2.size.height * 0.5, image2.size.width * 0.8, image2.size.height * 0.5)];
// 得到上下文中的图片
UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();
// 结束上下文
UIGraphicsEndImageContext();
// 5.回到主线程显示图片
dispatch_async(dispatch_get_main_queue(), ^{
[self.imageView setImage:fullImage];
self.imageView.contentMode = UIViewContentModeScaleAspectFill;
});
});
}
了解一下就OK了