一:前言:无demo说话不硬气,上github地址:https://github.com/horisea/PictureWhitening    
           欢迎star,你的星星是我持续创作的动力,在工具类里有所有的方法。

二:效果图
合成前合成后
三:思路:开启图形上线文,以原始图片位画布,其余图片不断往上加,最后合成一个新的图片。下面

//图片合成处理//
/***  return 合成后的图片 (以坐标为参考点,不准确)*  @param imageArray        图片数组  第一张图片位画布,所以最大*  @param frameArray        坐标数组  */
+ (UIImage *)composeImageWithArray:(NSArray<UIImage *> *)imageArrayframeArray:(NSArray *)frameArray;

解释:这种是以视图为基础点写的方法,即是不管图片的大小,只考虑view所在的imageView的frame,来适配,

实现部分
+ (UIImage *)composeImageWithArray:(NSArray<UIImage *> *)imageArray frameArray:(NSArray *)frameArray {if (imageArray.count == 0) {  return nil;  }if (imageArray.count == 1) {  return imageArray.firstObject;  }if (imageArray.count != frameArray.count) {  return nil;  }__block UIImage *image0;[imageArray enumerateObjectsUsingBlock:^(UIImage * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {if (obj.size.width == 0) {*stop = YES;image0 = idx == 0 ? obj : [imageArray objectAtIndex:idx - 1];}}];if (image0) {return image0;}NSMutableArray *arrayImages = imageArray.mutableCopy;NSMutableArray *arrayFrames = frameArray.mutableCopy;NSString *string = arrayFrames.firstObject;CGRect fristRect = CGRectFromString(string);UIImage *img0 = arrayImages.firstObject;CGFloat w0 = fristRect.size.width;CGFloat h0 = fristRect.size.height;// 以第一张的图大小为画布创建上下文UIGraphicsBeginImageContext(CGSizeMake(w0, h0));[img0 drawInRect:CGRectMake(0, 0, w0, h0)];// 先把第一张图片 画到上下文中for (int i = 1; i < arrayImages.count; i ++) {NSString *string2 = [arrayFrames objectAtIndex:i];CGRect secondRect = CGRectFromString(string2);UIImage *img1 = [arrayImages objectAtIndex:1];[img1 drawInRect:secondRect];// 再把小图放在上下文中}UIImage *resultImg = UIGraphicsGetImageFromCurrentImageContext();// 从当前上下文中获得最终图片UIGraphicsEndImageContext();// 关闭上下文return resultImg;
}

下面说第二种:即是,我知道第一张图片的大小,但是传进来的子图片的坐标只是view的frame,和实际的宽高比都要适用,,这个时候我只要知道第一张图片的宽高压缩比,那么子图片对应的在第一张图片上的位置也就确定了。

/***  return 合成后的图片 (以坐标为参考点,准确)*  @param mainImage        第一张图片位画布                          (必传,不可空)*  @param viewFrame        第一张图片所在View的frame(获取压缩比用)    (必传,不可空)*  @param imgArray         子图片数组                               (必传,不可空)*  @param frameArray       子图片坐标数组                            (必传,不可空)*/
+ (UIImage *)composeImageOnMainImage:(UIImage *)mainImagemainImageViewFrame:(CGRect)viewFramesubImageArray:(NSArray *)imgArraysubImageFrameArray:(NSArray *)frameArray;

实现部分

+ (UIImage *)composeImageOnMainImage:(UIImage *)mainImagemainImageViewFrame:(CGRect)viewFramesubImageArray:(NSArray *)imgArraysubImageFrameArray:(NSArray *)frameArray {if (!mainImage) {   return nil; }if (viewFrame.size.width == 0 || viewFrame.size.height == 0) {   return nil; }if (imgArray.count == 0) {  return nil;  }if (imgArray.count == 1) {  return imgArray.firstObject;  }if (imgArray.count != frameArray.count) {  return nil;  }// 此处拿到缩放比例CGFloat widthScale = mainImage.size.width / viewFrame.size.width;CGFloat heightScale = mainImage.size.height / viewFrame.size.height;UIGraphicsBeginImageContext(CGSizeMake(mainImage.size.width, mainImage.size.height));[mainImage drawInRect:CGRectMake(0, 0, mainImage.size.width, mainImage.size.height)];int i = 0;for (UIImage *img in imgArray) {NSString *string = [frameArray objectAtIndex:i];CGRect fristRect = CGRectFromString(string);[img drawInRect:CGRectMake(fristRect.origin.x * widthScale, fristRect.origin.y * heightScale, fristRect.size.width, fristRect.size.height)];i+=1;}UIImage *resultImg = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();return resultImg == nil ? mainImage : resultImg;
}

最后说明:个人推荐第二种方式比较准确,文章开头github地址有详细代码

iOS开发图片合成,多张图片合成一张图片相关推荐

  1. iOS开发-图片离线鉴黄 基于TensorFlow nsfw oc版

    iOS开发-图片离线鉴黄 基于TensorFlow nsfw oc版 前言-基于TensorFlow鉴黄 效果 首先要引入Firebase 鉴黄类的封装 OC版本的鉴黄demo Swift版本的鉴黄 ...

  2. iOS开发 图片选择器、图片多选功能的实现

    版权声明:本文为博主原创文章,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接. Photos.framework是iOS8后苹果推出的一套替代AssetsLibrary.f ...

  3. iOS开发图片格式选择

    图片是如何显示的 在讲解如何选择图片格式之前,我感觉有必要先了解下,图片是如何展示的.如果我们要展示一张图片,一般步骤是这样的: /// Assets.xcassets中的图片,不需要后缀 let i ...

  4. iOS开发图片控件(ImageView)绑定代码并显示一张图片

    我在之前的一篇博客<iOS中如何显示一张图片>中谈到如何使用Image View来显示图片,这个操作是直接在Main.storyboard实现的.也就是说这张图片是写死在界面中了.但是在以 ...

  5. iOS开发图片纯色填充(两种方式)和缩小图片

    UIImage图标换色和变换大小 这里的图片大都指只有两个色的图标,有时候我们的图标需要根据不同的状态显示不同的颜色,有一种简单的处理方式是,将不同状态的颜色图标都切出来,变换状态的时候直接使用相应的 ...

  6. IOS自定义图片浏览器,支持浏览多张图片,点击,双击,两手指缩放操作,并显示加载进度条

    图片浏览器Controller的主要思路是:新建一个 JZAlbumViewController,在这个controller里主要显示一个UIScrollView,这个UIScrollView用来显示 ...

  7. iOS开发 - 图片实现多层折叠效果

    为什么80%的码农都做不了架构师?>>>    #效果 #Demo Demo地址:https://github.com/Resory/RYMutipleFoldImageView 如 ...

  8. iOS开发——图片转PDF的实现方法

    2019独角兽企业重金招聘Python工程师标准>>> http://blog.csdn.net/yiyaaixuexi/article/details/8209188 转载于:ht ...

  9. 【ios开发 -- 图片处理 -- 抠图】

    在大多图像处理中,我们会应用到高斯模糊处理图像,通常用它来减少图像噪声以及降低细节层次.在此文中介绍了高斯模糊的实现和可选区域的模糊[美图秀秀-背景虚化] 高斯模糊的原理中,它是根据高斯曲线调节像素色 ...

  10. iOS开发---图片拉伸不变形

    话不多说,直接上代码 //原始大小 UIImage *image1 = [UIImageimageNamed:@"mall_icon_y"]; UIButton *btn1 = [ ...

最新文章

  1. SAP PM (工厂维护)模块介绍 - SAP入门必看
  2. VS2008中代码段(Snippet)及代码段编辑
  3. python算法详解张玲玲电子版_算法之路该如何学习?
  4. 使用jmap命令手动导出映像文件?
  5. Haar特征与积分图—概念解析
  6. 利用微信公众号实现zabbix告警
  7. PHP_变量什么情况下加大括号{}
  8. mysql的dql_Mysql:dql(基本数据查询)
  9. 记录一次keil调试过程:自动识别GPS厂家芯片
  10. TMI 202107论文速递(IEEE Transactions on Medical Imaging)
  11. Code For Better 谷歌开发者之声——使用谷歌浏览器 Chrome 更好地调试
  12. 全媒体时代的速度与激情:香港凤凰卫视云端转型实践
  13. 三维空间两直线/线段最短距离、线段计算算法
  14. 推荐10个实用的程序员开发常用工具
  15. 百鸡问题用计算机什么法解决,《穷举法解决问题》教学设计
  16. Unity接入QuickSdk实战
  17. ROC曲线绘制相关R包下载和安装方式
  18. Android 自定义 Toast
  19. 【美股】美股中的几种分析形态
  20. python中构造方法 id自增_Python+MongoDB自增键值的简单实现

热门文章

  1. geem2登陆器修改服务器列表,Gee引擎怎么更换登陆器皮肤 GeeM2传奇编辑自定义皮肤的方法讲解...
  2. 为什么excel中取消隐藏行后仍然有隐藏的行
  3. 2017 多校4 Dirt Ratio
  4. 大数据软件的国内镜像
  5. java课程结课论文_Java技术综合课程设计论文
  6. (转)s3c6410 开发板Linux系统支持 K9GAG08U0E的方法
  7. 20190301 小中大
  8. 【渝粤题库】陕西师范大学163208 饭店管理 作业
  9. 2016-2017 ACM-ICPC, South Pacific Regional Contest (SPPC 16)
  10. java 清理页面缓存数据_清除浏览器缓存的几种方法总结(必看)