打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
iOS开发多线程之队列组----下载合并图片

1.设计思路

要合并两张图片,用Quartz2D的知识,则要先要搞一个空的大图片,然后再把两张小图片画到那张大图片上面


2.实现(由一般实现再过度到队列组)

2.1方法一(先下载第1张图片,然后下载第2张图片,最后合并图片)弊病:由于图片比较耗时,一张一张的下载图片更耗时。

2.1.1首先创建一个project,然后拖一个imageview


2.1.2连线监听imageview


2.1.3代码

  1. //  htingViewController.h  
  2.   
  3. #import <UIKit/UIKit.h>  
  4.   
  5. @interface htingViewController : UIViewController  
  6.   
  7. @end  

  1. //  
  2. //  htingViewController.m  
  3.   
  4.   
  5. #import "htingViewController.h"  
  6.   
  7. @interface htingViewController ()  
  8. @property (weak, nonatomic) IBOutlet UIImageView *imageView;  
  9. @property (nonatomic, strong) UIImage *image1;  
  10. @property (nonatomic, strong) UIImage *image2;  
  11. @end  
  12.   
  13. @implementation htingViewController  
  14.   
  15. - (void)viewDidLoad  
  16. {  
  17.     [super viewDidLoad];  
  18.     // Do any additional setup after loading the view, typically from a nib.  
  19. }  
  20.   
  21. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  
  22. {  
  23.     // 异步下载  
  24.     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
  25.         // 1.下载第1张  
  26.         NSURL *url1 = [NSURL URLWithString:@"http://g.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494ee460de6182ff5e0fe99257e80.jpg"];  
  27.         NSData *data1 = [NSData dataWithContentsOfURL:url1];  
  28.         UIImage *image1 = [UIImage imageWithData:data1];  
  29.           
  30.         // 2.下载第2张  
  31.         NSURL *url2 = [NSURL URLWithString:@"http://su.bdimg.com/static/superplus/img/logo_white_ee663702.png"];  
  32.         NSData *data2 = [NSData dataWithContentsOfURL:url2];  
  33.         UIImage *image2 = [UIImage imageWithData:data2];  
  34.           
  35.         // 3.合并图片  
  36.         // 开启一个位图上下文  
  37.         UIGraphicsBeginImageContextWithOptions(image1.size, NO, 0.0);  
  38.           
  39.         // 绘制第1张图片  
  40.         CGFloat image1W = image1.size.width;  
  41.         CGFloat image1H = image1.size.height;  
  42.         [image1 drawInRect:CGRectMake(0, 0, image1W, image1H)];  
  43.           
  44.         // 绘制第2张图片  
  45.         CGFloat image2W = image2.size.width * 0.5;  
  46.         CGFloat image2H = image2.size.height * 0.5;  
  47.         CGFloat image2Y = image1H - image2H;  
  48.         [image2 drawInRect:CGRectMake(0, image2Y, image2W, image2H)];  
  49.           
  50.         // 得到上下文中的图片  
  51.         UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();  
  52.           
  53.         // 结束上下文  
  54.         UIGraphicsEndImageContext();  
  55.           
  56.         // 4.回到主线程显示图片  
  57.         dispatch_async(dispatch_get_main_queue(), ^{  
  58.             self.imageView.image = fullImage;  
  59.         });  
  60.     });  
  61. }  
  62.   
  63.   
  64. @end  


2.1.4运行结果



2.2.方法二(由于上面的设计中下载图片比较耗时,可以同事开启两个线程同事下载两张图片  )弊病:要搞两个额外的属性

  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface htingViewController : UIViewController  
  4.   
  5. @end  

  1. //  
  2. //  htingViewController.m  
  3.   
  4.   
  5. #import "htingViewController.h"  
  6.   
  7. @interface htingViewController ()  
  8. @property (weak, nonatomic) IBOutlet UIImageView *imageView;  
  9. @property (nonatomic, strong) UIImage *image1;  
  10. @property (nonatomic, strong) UIImage *image2;  
  11. @end  
  12.   
  13. @implementation htingViewController  
  14.   
  15. - (void)viewDidLoad  
  16. {  
  17.     [super viewDidLoad];  
  18.     // Do any additional setup after loading the view, typically from a nib.  
  19. }  
  20.   
  21. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  
  22. {  
  23.       
  24.     // 异步下载  
  25.     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
  26.         // 1.下载第1张  
  27.         NSURL *url1 = [NSURL URLWithString:@"http://g.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494ee460de6182ff5e0fe99257e80.jpg"];  
  28.         NSData *data1 = [NSData dataWithContentsOfURL:url1];  
  29.         self.image1 = [UIImage imageWithData:data1];  
  30.           
  31.         [self bindImages];  
  32.     });  
  33.     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
  34.         // 2.下载第2张  
  35.         NSURL *url2 = [NSURL URLWithString:@"http://su.bdimg.com/static/superplus/img/logo_white_ee663702.png"];  
  36.         NSData *data2 = [NSData dataWithContentsOfURL:url2];  
  37.         self.image2 = [UIImage imageWithData:data2];  
  38.           
  39.         [self bindImages];  
  40.     });  
  41.       
  42. }  
  43. - (void)bindImages  
  44. {  
  45.     if (self.image1 == nil || self.image2 == nil) return;  
  46.       
  47.     // 3.合并图片  
  48.     // 开启一个位图上下文  (相当于创建了一个空的图片)  
  49.     // UIGraphicsBeginImageContextWithOptions(<#CGSize size#>(新的图片有多大), <#BOOL opaque#>(NO代表透明,YES代表不透明), <#CGFloat scale#> (缩放比例))  
  50.     UIGraphicsBeginImageContextWithOptions(self.image1.size, NO, 0.0);  
  51.       
  52.     // 绘制第1张图片 (绘制到上面创建的那个位图上下文上面 也就是那张空的图片上面)  
  53.     CGFloat image1W = self.image1.size.width;  
  54.     CGFloat image1H = self.image1.size.height;  
  55.     [self.image1 drawInRect:CGRectMake(0, 0, image1W, image1H)];  
  56.       
  57.     // 绘制第2张图片  
  58.     CGFloat image2W = self.image2.size.width * 0.5;  
  59.     CGFloat image2H = self.image2.size.height * 0.5;  
  60.     CGFloat image2Y = image1H - image2H;  
  61.     //把image2 绘制到后面的那个区域  
  62.     [self.image2 drawInRect:CGRectMake(0, image2Y, image2W, image2H)];  
  63.       
  64.     // 得到上下文中的图片  
  65.     UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();  
  66.       
  67.     // 结束上下文  
  68.     UIGraphicsEndImageContext();  
  69.       
  70.     // 4.回到主线程显示图片  
  71.     dispatch_async(dispatch_get_main_queue(), ^{  
  72.         self.imageView.image = fullImage;  
  73.     });  
  74. }  
  75.   
  76. @end  

2.3方法三 队列组

  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface htingViewController : UIViewController  
  4.   
  5. @end  

  1. //  
  2. //  htingViewController.m  
  3.   
  4.   
  5. #import "htingViewController.h"  
  6.   
  7. @interface htingViewController ()  
  8. @property (weak, nonatomic) IBOutlet UIImageView *imageView;  
  9. //@property (nonatomic, strong) UIImage *image1;  
  10. //@property (nonatomic, strong) UIImage *image2;  
  11. @end  
  12.   
  13. @implementation htingViewController  
  14.   
  15. - (void)viewDidLoad  
  16. {  
  17.     [super viewDidLoad];  
  18.     // Do any additional setup after loading the view, typically from a nib.  
  19. }  
  20.   
  21. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  
  22. {  
  23.       
  24.     // 1.队列组  
  25.     dispatch_group_t group = dispatch_group_create();  
  26.     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  27.       
  28.     // 2.下载图片1  
  29.     __block UIImage *image1 = nil;  //要加一个 __block因为 block代码默认不能改外面的东西(记住语法即可)  
  30.     dispatch_group_async(group, queue, ^{  
  31.         NSURL *url1 = [NSURL URLWithString:@"http://g.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494ee460de6182ff5e0fe99257e80.jpg"];  
  32.         NSData *data1 = [NSData dataWithContentsOfURL:url1];  
  33.         image1 = [UIImage imageWithData:data1];  
  34.     });  
  35.       
  36.     // 3.下载图片2  
  37.     __block UIImage *image2 = nil;  
  38.     dispatch_group_async(group, queue, ^{  
  39.         NSURL *url2 = [NSURL URLWithString:@"http://su.bdimg.com/static/superplus/img/logo_white_ee663702.png"];  
  40.         NSData *data2 = [NSData dataWithContentsOfURL:url2];  
  41.         image2 = [UIImage imageWithData:data2];  
  42.     });  
  43.       
  44.     // 4.合并图片 用Quartz2D的知识,则要先要搞一个空的大图片,然后再把小图片画上去(保证执行完组里面的所有任务之后,再执行notify函数里面的block)  
  45.     //队列组:要把队列组里面的所有任务都执行完后调用dispatch_group_notify(group, queue, ^{ }  
  46.     dispatch_group_notify(group, queue, ^{  
  47.         // 开启一个位图上下文  
  48.         UIGraphicsBeginImageContextWithOptions(image1.size, NO, 0.0);  
  49.           
  50.         // 绘制第1张图片  
  51.         CGFloat image1W = image1.size.width;  
  52.         CGFloat image1H = image1.size.height;  
  53.         [image1 drawInRect:CGRectMake(0, 0, image1W, image1H)];  
  54.           
  55.         // 绘制第2张图片  
  56.         CGFloat image2W = image2.size.width * 0.5;  
  57.         CGFloat image2H = image2.size.height * 0.5;  
  58.         CGFloat image2Y = image1H - image2H;  
  59.         [image2 drawInRect:CGRectMake(0, image2Y, image2W, image2H)];  
  60.           
  61.         // 得到上下文中的图片  
  62.         UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();  
  63.           
  64.         // 结束上下文  
  65.         UIGraphicsEndImageContext();  
  66.           
  67.         // 5.回到主线程显示图片  
  68.         dispatch_async(dispatch_get_main_queue(), ^{  
  69.             self.imageView.image = fullImage;  
  70.         });  
  71.     });  
  72.       
  73. }  
  74.   
  75. @end  


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
SVProgressHUD–比MBProgressHUD更好用的 iOS进度提示组件
iOS 异步下载图片
ios通过按钮点击异步加载图片
iOS的多线程
[iphone开发多线程之]iOS的多核编程和内存管理
iOS学习——图片压缩到指定大小以内
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服