iOS开发之CGContextRef(多张图片保存为一张)

前言

前段时间,由于公司接了一个书法的项目,里面迭代的内容涉及到了这个整图保存相册的功能.但是自己之前也没有真正的了解过这个具体是什么实现的,于是自己网上就搜索了很多关于这个方面的资料看看,才知道,原来这是画布就可以实现的了.好了,闲言少叙

具体实现步骤

  1. 首先很简单啊,就是要把你保存的图片或者字体存放在一个NSArray中,当然这个数组可能会是两种类型,这个定义模型的时候需要确定好
  2. 其次就是开始或整张图片的背景,这背景可以是默认的白底,也可以是你想要的任何一张图片,只要的画之前把这个定义好就行
  3. 接下来的画就是将你要的图片一张一张画到这个背景图片里面去了,这一步很重要.下面就直接上代码吧.

代码实现

- (BOOL)mergedImageWithImageArray:(NSArray *)imgArray
{
    UIEdgeInsets edgeInsets = UIEdgeInsetsMake(10, 10, 10, 10);//背景图的上下左右间隔
    CGFloat imageLie = 1;//每张图片的大列间隔
    CGFloat imageHang = 1;//每张图片的行间隔

    //单个图片的宽高
    CGFloat image_width = (CGRectGetWidth(self.view.bounds) - 20)/self.index_lie;
    //背景图的宽度
    CGFloat bgImgWidth = self.index_lie*image_width + (self.index_lie - 1) *imageLie + edgeInsets.left + edgeInsets.right;
    //背景图高度
    CGFloat bgImgHeight = self.index_hang*image_width + (self.index_hang -1) * imageHang + edgeInsets.top + edgeInsets.bottom;
    //背景图的大小
    UIGraphicsBeginImageContext(CGSizeMake(bgImgWidth, bgImgHeight));


    for (int i = 0; i < imgArray.count; i++)
    {
        id data = imgArray[i];
        int lang = i % _index_hang;
        int lie = i / _index_hang;
        //横着画
//        CGFloat x = edgeInsets.left + lie * (image_width + imageLie);
//        CGFloat y = edgeInsets.top + lang * (image_width + imageHang);
        //竖着画
        CGFloat x = (bgImgWidth - image_width -lie - (image_width + imageLie) * lie)-edgeInsets.left;
        CGFloat y = edgeInsets.top+(image_width+imageHang)*lang;
        if ([data isKindOfClass:[UIImage class]])
        {
            UIImage *image = imgArray[i];
            [image drawInRect:CGRectMake(x, y, image_width, image_width)];
        }
        else if ([data isKindOfClass:[NSString class]])
        {
            NSString *text = imgArray[i];
            CGFloat textSize = image_width/2;
            UIFont *font = [UIFont systemFontOfSize:textSize];
            NSMutableParagraphStyle* paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
            paragraphStyle.alignment = NSTextAlignmentCenter;//居中显示
            paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping;
            NSDictionary* attribute = @{
                                        NSForegroundColorAttributeName:[UIColor blackColor],//设置文字颜色
                                        NSFontAttributeName:font,//设置文字的字体
                                        NSParagraphStyleAttributeName:paragraphStyle,//设置文字的样式
                                        };
            CGFloat textY = y + (image_width-textSize)/2;//文字垂直居中
            [text drawInRect:CGRectMake(x, textY, image_width, image_width) withAttributes:attribute];
        }

    }
    //获取上下文并将图片保存相册
    UIImage *newMergeImg = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    if (newMergeImg == nil) {
        return NO;
    }
    else {
        UIImageWriteToSavedPhotosAlbum(newMergeImg, self, nil, nil);
        return YES;
    }
}

最终保存效果

image

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值