iOS开发中的小技巧 - 多张图合成一张

本文介绍了一种在iOS中将多张图片合成一张的方法,并提供了一个具体的实现案例。通过使用UIKit框架中的UIGraphicsBeginImageContext等函数,实现了在主图片上绘制其他图片的功能,并将最终合成的图片保存到相册。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

iOS多张图片合成一张

本文来源于http://www.cnblogs.com/yang-guang-girl/p/5197099.html,感谢博主

  • 代码
#import "RootViewController.h"

@interface RootViewController ()

@end

@implementation RootViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    NSArray *imgArray = [[NSArray alloc] initWithObjects:
                         [UIImage imageNamed:@"1.jpg"],
                         [UIImage imageNamed:@"2.jpg"],
                         [UIImage imageNamed:@"3.jpg"],
                         [UIImage imageNamed:@"4.jpg"],
                         [UIImage imageNamed:@"5.jpg"],
                        nil];
    
    NSArray *imgPointArray = [[NSArray alloc] initWithObjects:
                              @"10", @"10",
                              @"10", @"25",
                              @"30", @"15",
                              @"30", @"50",
                              @"20", @"80",
                              nil];
    
    
    BOOL suc = [self mergedImageOnMainImage:[UIImage imageNamed:@"1.jpg"] WithImageArray:imgArray AndImagePointArray:imgPointArray];
    
    if (suc == YES) { 
        NSLog(@"Images Successfully Mearged & Saved to Album"); 
    } 
    else { 
        NSLog(@"Images not Mearged & not Saved to Album"); 
    }
    
}
#pragma -mark -functions
//多张图片合成一张
- (BOOL) mergedImageOnMainImage:(UIImage *)mainImg WithImageArray:(NSArray *)imgArray AndImagePointArray:(NSArray *)imgPointArray
{
    
    UIGraphicsBeginImageContext(mainImg.size);
    
    [mainImg drawInRect:CGRectMake(0, 0, mainImg.size.width, mainImg.size.height)];
    int i = 0;
    for (UIImage *img in imgArray) {
        [img drawInRect:CGRectMake([[imgPointArray objectAtIndex:i] floatValue],
                                   [[imgPointArray objectAtIndex:i+1] floatValue],
                                   img.size.width,
                                   img.size.height)];
        
        i+=2;
    }
    
    CGImageRef NewMergeImg = CGImageCreateWithImageInRect(UIGraphicsGetImageFromCurrentImageContext().CGImage,
                                                          CGRectMake(0, 0, mainImg.size.width, mainImg.size.height));
    
    UIGraphicsEndImageContext();
    if (NewMergeImg == nil) {
        return NO;
    }
    else {
        UIImageWriteToSavedPhotosAlbum([UIImage imageWithCGImage:NewMergeImg], self, nil, nil);
        return YES;
    }
}



- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
  • 自己的代码没有贴上,来个效果图吧

762322-20170427151447865-450376635.png

转载于:https://www.cnblogs.com/gchlcc/p/6774420.html

### 合并多张片生成序列帧大的方法 对于游戏开发或其他多媒体应用来说,将多张合成为一个大的序列帧像能够简化资源管理和加载过程。以下是几种方法和技术用于实现这一目标。 #### 使用Python脚本合并序列帧 通过编写简单的Python程序可以自动化地完成这项工作。这种方法灵活性高,适合那些希望定制化解决方案的人群。代码如下所示: ```python from PIL import Image import os def merge_images(image_paths, output_path): images = [Image.open(x) for x in image_paths] widths, heights = zip(*(i.size for i in images)) total_width = sum(widths) max_height = max(heights) new_im = Image.new('RGBA', (total_width, max_height)) x_offset = 0 for im in images: new_im.paste(im, (x_offset,0)) x_offset += im.size[0] new_im.save(output_path) ``` 此段代码读取指定路径下的所有片文件,并按照它们原始顺序水平排列组合成一个新的较大尺寸的PNG格式文件[^1]。 #### 利用专门软件——TexturePacker 或 CppTextu 当面对大量素材时,手动操作变得不切实际;此时可借助专业的打包工具如 TexturePacker 来高效处理这个问题。它不仅支持创建单一大还允许定义额外参数控制输出质量以及优化方式。不过需要注意的是,TexturePacker 是一款付费产品。作为替代方案,开源项目 CppTextu 可提供相似的功能而无需支付费用。命令行调用示例如下: ```bash CppTextu input_folder -o output_file.png --format png --max-size 2048 ``` 上述指令将会遍历 `input_folder` 下所有的子目录寻找符合条件的小标并将它们整理到一起形成新的 `.png` 文件,同时确保最终产物不会超过给定的最大边长限制(此处设为2048像素)。此外还会自动生成对应的描述文件以便于后续解析使用[^2]。 #### Unity内置功能 如果是在Unity引擎环境中作业,则可以直接利用其自带API轻松达成目的。具体做法是先导入所需的所有独立帧至工程内部,接着运用特定组件或插件辅助构建连贯性的Sprite Sheet对象。这种方式的优势在于完全集成到了编辑器界面当中,降低了外部依赖风险同时也便于团队协作交流[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值