绘图时将变换应用于UIImage

时间:2014-01-30 22:38:15

标签: ios uiimage quartz-graphics cgaffinetransform

尝试将可缩放或旋转的较小图像叠加到较大的图像上:

+ (UIImage*)addToImage:(UIImage *)baseImage newImage:(UIImage*)newImage atPoint:(CGPoint)point transform:(CGAffineTransform)transform {

    UIGraphicsBeginImageContext(baseImage.size);
    [baseImage drawInRect:CGRectMake(0, 0, baseImage.size.width, baseImage.size.height)];

    [newImage drawAtPoint:point];
    //How would I apply the transform?

    UIImage* result = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

return result;
}

如何在此上下文中将CGAffineTransform应用于newImage?

2 个答案:

答案 0 :(得分:7)

您可以使用CoreImage框架,这允许在CIImage个实例上进行转换。例如:

CGAffineTransform transform = ...;
CIImage* coreImage = newImage.CIImage;

if (!coreImage) {
    coreImage = [CIImage imageWithCGImage:newImage.CGImage];
}

coreImage = [coreImage imageByApplyingTransform:transform];
newImage = [UIImage imageWithCIImage:coreImage];

您需要确保在致电.CIImage后,这不是nil。如果使用UIImage初始化CGImage,则会发生这种情况。如果是这种情况,那么您需要使用适当的初始化程序自行分配CIImage

答案 1 :(得分:1)

这样的事情应该这样做:

+ (UIImage*) addToImage:(UIImage *)baseImage newImage:(UIImage*)newImage atPoint:(CGPoint)point transform:(CGAffineTransform)transform {

    UIGraphicsBeginImageContext(baseImage.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    [baseImage drawInRect:CGRectMake(0, 0, baseImage.size.width, baseImage.size.height)];

//    [newImage drawAtPoint:point];  draw without applying the transformation

    CGRect originalRect = CGRectMake(point.x,
                                     point.y,
                                     newImage.size.width,
                                     newImage.size.height);


    CGContextConcatCTM(context, transform);
    CGContextDrawImage(context, originalRect, newImage.CGImage);

    UIImage* result = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return result;
}