在CGContextRef中为drawInRect应用变换

时间:2014-02-01 03:49:43

标签: ios uiimage quartz-graphics cgcontext cgaffinetransform

在下面的代码中,我将一个小图像添加到一个大图像。我需要能够将变换应用于小图像。现在有些奇怪的事情正在发生,例如,如果我传入CGAffineTransformMakeRotation(M_PI_2)的变换,则newImage不会旋转到位,而是在屏幕外的某处绘制。我该如何解决这个问题?

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

    UIGraphicsBeginImageContextWithOptions(baseImage.size, NO, 1);
    CGContextRef context = UIGraphicsGetCurrentContext();

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

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

    CGContextConcatCTM(context, transform);
    [newImage drawInRect:newRect];

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

    return result;
}

请注意,我只想将变换应用于newImage,而不是baseImage。

1 个答案:

答案 0 :(得分:5)

好像你只是忘了在旋转之前和之后翻译上下文的来源。在这里,试试这个:

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

    UIGraphicsBeginImageContextWithOptions(baseImage.size, NO, [[UIScreen mainScreen] scale]);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGRect baseRect = CGRectMake(0, 0, baseImage.size.width, baseImage.size.height);

    [baseImage drawInRect:baseRect];

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

    CGContextTranslateCTM(context, point.x, point.y);
    CGContextConcatCTM(context, transform);
    CGContextTranslateCTM(context, -point.x, -point.y);

    [newImage drawInRect:newRect];

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

    return result;
}

修改

如果要围绕图像中心旋转图像,请将图像边的一半添加到相应的平移值中:

float xTranslation = point.x+newRect.size.width/2;
float yTranslation = point.y+newRect.size.height/2;

CGContextTranslateCTM(context, xTranslation, yTranslation);
CGContextConcatCTM(context, transform);
CGContextTranslateCTM(context, -xTranslation, -yTranslation);