2014-01-30 32 views
3

當試圖疊加可以縮放或旋轉到啤酒圖像較小的圖像:應用轉換到一個UIImage繪圖

+ (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在這種情況下?

回答

6

您可以使用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

+0

我無法找到'imageFromCIImage',哪裏是它的參考? – oarfish

+0

對不起,應該是'imageWithCIImage:',是一個錯字。我已經更新了答案。 – WDUK

+0

方向如何?它在變形後破碎了! – tspentzas

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

這會顛倒newImage。 – soleil

+0

如何使用此代碼.. –