1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > iOS开发图片合成 多张图片合成一张图片

iOS开发图片合成 多张图片合成一张图片

时间:2019-11-27 18:02:19

相关推荐

iOS开发图片合成 多张图片合成一张图片

一:前言:无demo说话不硬气,上github地址:/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地址有详细代码

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。