首页 > iOS 将两张image合并成一张image

iOS 将两张image合并成一张image

viewController 中有两个imageView,其中一张有倾斜(imageView的transform属性发生改变),将这两张image合成一张,保持相对的位置不变。

效果大致如下图(第二张的位置有问题)


两张image旋转合成 有demo嘛 大神 发我一份吧 谢谢 啦

    824867471@qq.com     不胜感激

有些乱但最终还是解决了实际的问题!
- (UIImage *)saveImageWithUIImage:(UIImage *)srcImage{
//要绘制的实际image
UIImage *mergeImage = srcImage;

UIGraphicsBeginImageContext(mergeImage.size);
CGContextRef context = UIGraphicsGetCurrentContext();
/*
 *背景image绘制到上下文中
 */
[mergeImage drawInRect:(CGRect){0, 0, mergeImage.size.width, mergeImage.size.height}];
//imageView上的所有子视图
for (UIView *view  in [self.baseView subviews]) {
    if ([view isKindOfClass:[ZDStickerView class]]) {
        ZDStickerView *stickerView = (ZDStickerView *)view;
        /*
         * step_1.1 :移动坐标中心点至要绘制view的中心
         */
        CGPoint translateCenter = [self getTranslatePositionWithImageSize:mergeImage.size imageViewSize:self.baseView.bounds.size originPosition:stickerView.layer.position contentModle:self.baseView.contentMode];
        CGContextTranslateCTM(context, translateCenter.x, translateCenter.y);
        /*
         * step_1.2 :移动坐标中心点至要绘制view的左上角
         */
        CGPoint traslateCorner = [self getTranslateCornerPositionWithScaleRate:[self getScaleRateWithImageSize:mergeImage.size imageViewSize:self.baseView.bounds.size contentMode:self.baseView.contentMode] layerSize:stickerView.endScaleSize transformAngle:stickerView.endDeltaAngle];
        CGContextTranslateCTM(context, traslateCorner.x, traslateCorner.y);
        /*
         * step_2 : 旋转坐标
         */
        CGContextRotateCTM(context, stickerView.endDeltaAngle);

        /*
         * step_3 : 绘制
         */
        CGSize t_size = [self getTranslateSizeWithImageSize:mergeImage.size imageViewSize:self.baseView.bounds.size originSize:stickerView.endScaleSize contentMode:self.baseView.contentMode];
        UIImageView *drawImageView = (UIImageView *)stickerView.contentView;
        [drawImageView.image drawInRect:(CGRect){0, 0, t_size.width, t_size.height}];
        /*
         * step_4 : 恢复坐标系
         */
        CGContextRotateCTM(context, -stickerView.endDeltaAngle);
        CGContextTranslateCTM(context, -traslateCorner.x, -traslateCorner.y);
        CGContextTranslateCTM(context, -translateCenter.x, -translateCenter.y);
    }
}
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;

}

}

/*
*甲片在绘图上下文中的尺寸
*/
- (CGSize)getTranslateSizeWithImageSize:(CGSize)imageSize imageViewSize:(CGSize)viewSize originSize:(CGSize)size{
float viewRate = viewSize.width / viewSize.height;
float imageRate = imageSize.width / imageSize.height;

float size_w = size.width;
float size_h = size.height;
/*
 * image的宽按比例缩放,竖向上得到裁剪
 */
if (viewRate > imageRate) {
    float rate = imageSize.width / viewSize.width;
    size_w *= rate;
    size_h *= rate;
}
/*
 * image的高按比例缩放,横向上得到裁剪
 */
else{
    float rate = imageSize.height / viewSize.height;
    size_w *= rate;
    size_h *= rate;
}
return (CGSize){size_w,size_h};

}
//对角线与x轴的夹角
- (float)programWithWidth:(float)w height:(float)h{
float p = [self halfDiagonalLengthWithWidth:w height:h];
float dis = 0 - w * 0.5;
float dis_p = dis / p;
return acosf(dis_p);
}

//对角线的一半
- (float)halfDiagonalLengthWithWidth:(float)w height:(float)h{
return sqrtf(w * w / 4.0 + h * h / 4.0);
}


楼主你好,我想问一下那个self.baseView是什么类啊(自定义的?),stickerView.endScaleSize,stickerView.endDeltaAngle的属性哪里来的啊,我下载ZDStickerView里面没有啊,谢谢啊!


设置第二张imageView.layer.zPosition = CGPointMake(.5, 1);
注意frame会改变 自己setFrame一下 这个时候frame的参考点变成下边中间的点了

【热门文章】
【热门文章】