Apply a transform to a UIImage when drawing

soleil picture soleil · Jan 30, 2014 · Viewed 9.6k times · Source

Trying to superimpose a smaller image which may be scaled or rotated onto a lager image:

+ (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;
}

How would I apply the CGAffineTransform to newImage in this context?

Answer

WDUK picture WDUK · Jan 30, 2014

You can use the CoreImage framework, this allows transformations on CIImage instances. For example:

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

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

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

You'll need to ensure that after calling .CIImage, that is isn't nil. This will occur if the UIImage was initialised with a CGImage. If this is the case, then you'll need to allocate a CIImage yourself with the appropriate initialiser.