UIImage与CGAffineTransform在CGContext奇怪的输出中绘制

时间:2013-07-26 18:38:44

标签: uiimageview uikit core-graphics cgaffinetransform

我有一个包含UIImageView的UIView,我将旋转变换应用于UIImageView,然后想要在CGContext中使用相同的旋转变换绘制该图像(并且将来会使用更多变换,如翻译和缩放),我有下面的代码在CGContext中进行转换和绘图:

UIImage *image=[UIImage imageNamed:@"cena-1.png"];
CGRect imageFrame=CGRectMake(50, 50, image.size.width, image.size.height);
UIImageView *imageView=[[UIImageView alloc] initWithFrame:imageFrame];
imageView.image=image;
[self.view addSubview:imageView];

CGAffineTransform imageTransform=CGAffineTransformMakeRotation(degreesToRadians(10));
imageView.transform=imageTransform;
NSLog(@"self.imgOverlay.image.scale: %f", imageView.image.scale);

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, [UIScreen mainScreen].scale);
CGContextRef context = UIGraphicsGetCurrentContext();
UIGraphicsPushContext(context);

CGContextConcatCTM(context, imageView.transform);

CGRect modifiedRect=CGRectApplyAffineTransform(imageFrame, imageTransform);
[imageView.image drawInRect:modifiedRect];

UIGraphicsPopContext();
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

NSString *jpgPath=[NSTemporaryDirectory() stringByAppendingPathComponent:@"test.jpg"];
NSData *imageData=UIImageJPEGRepresentation(outputImage, 1.0);
[imageData writeToFile:jpgPath atomically:YES];

NSLog(@"putputImage path: %@", jpgPath);

问题是outputimage看起来与UIKit的UIVIew中显示的不一样,它变得偏斜,位置也不准确,这是截图:

enter image description here

请指导我做错了什么,谢谢你的帮助:)

P.S。我还发布了另一个问题(https://stackoverflow.com/questions/17873202/uiimage-drawn-in-cgcontext-with-cgaffinetransform-unexpected-results)并解释了完整的方案,但是希望这个问题的回答是足够的。

更新 我试过[imageView.image drawAtPoint:modifiedRect.origin];它纠正了偏差问题(http://screencast.com/t/v2oKkmkd),但位置问题仍然存在:(

更新2 这是一个带有一点修改代码的测试项目:https://github.com/abduliam/TestTransform

1 个答案:

答案 0 :(得分:1)

不是旋转矩形,而是旋转整个绘图上下文,然后在那个矩形中绘制它。

例如,这将绘制旋转-15度的图像:

    CGRect clipped = CGRectInset(screenRect, 100, 100);
    CGContextRotateCTM(ctx,  -15 * M_PI / 180.0);
    [imageView.image drawInRect: clipped];