2013-01-14 83 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使用主屏幕的比例因子,這意味着該代碼可以在不修改的情況下在視網膜設備上正常工作。 –