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了

上一篇下一篇

猜你喜欢

热点阅读