2013-01-14 41 views
1

我想以特定大小拍摄特定位置的屏幕截图。我找到了这个。但它需要整个屏幕。我在哪里可以设置CGRect。UIGraphicsGetImageFromCurrentImageContext in specific CGRect

UIGraphicsBeginImageContext(self.window.bounds.size); 
[self.window.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

回答

12

实际上前几天我被困在这......然后过了一会儿,我设法想出了一个解决方案!我实施了一个类别:

#import "UIView+RenderSubframe.h" 
#import <QuartzCore/QuartzCore.h> 

@implementation UIView (RenderSubframe) 

- (UIImage *) renderWithSubframe:(CGRect)frame { 

    UIGraphicsBeginImageContextWithOptions(frame.size, NO, 0.0); 
    CGContextRef c = UIGraphicsGetCurrentContext(); 

    CGContextConcatCTM(c, CGAffineTransformMakeTranslation(-frame.origin.x, -frame.origin.y)); 
    [self.layer renderInContext:c]; 

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

    return screenshot; 

} 

@end 

瞧!

如果我没有记错的话,这个方法并不实际渲染视图的一部分不需要在所有的,使这个效率远高于事后裁剪图像。

在你的情况,你想将这个类别应用到UIWindow类而不是UIView。

+1

我可能会误解,但是这种方法在视网膜设备上无法正常工作,因为您传递的是0.0而不是'[UIScreen mainScreen] .scale'作为'scale'参数。您还没有乘以尺寸参数满足视网膜的尺寸,这种方法将总是返回质量差的图像我使用视网膜设备的代码,并没有遇到这个问题 – Eugene

+0

,图像在返回正确的分辨率。据我所知,使用0.0自动缩放视网膜设备。 –

+2

@Eugene刚刚检查了苹果文档,0.0使用主屏幕的比例因子,这意味着该代码可以在不修改的情况下在视网膜设备上正常工作。 –