-(UIImage *)screenImageWithSize:(CGSize )imgSize{ UIGraphicsBeginImageContext(imgSize); CGContextRef context = UIGraphicsGetCurrentContext(); AppDelegate * app = (AppDelegate *)[UIApplication sharedApplication].delegate; //獲取app的appdelegate,便於取到當前的window用來截屏 [app.window.layer renderInContext:context]; UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return img; }
UIGraphicsBeginImageContext()方法會構建一個基於位圖(bitmap)的圖形context,而且這個context會成爲當前context。而後經過renderInContext方法把 app.window.layer 渲染進當前的圖形context。最後經過UIGraphicsGetImageFromCurrentImageContext()獲取當前圖形context上的圖片,從而獲取屏幕截圖。app
UIGraphicsBeginImageContext()方法傳入惟一參數,是一個CGSize變量,用來指定圖形context的大小,因此獲取屏幕截圖的時候這個size該是屏幕的大小。其實瞭解了這個過程,就知道這個方法能夠獲取任意區域的截圖,固然是必須當前頁面的一部分。你須要截取哪一個view的圖像,就讓這個view的layer調用renderInContext把圖形渲染進當前圖形context。spa
二、縮放圖片:code
-(UIImage *)scaleImage:(UIImage *)img toScale:(CGFloat )scale{ CGSize imgSize = img.size; CGSize scaleSize = CGSizeMake(imgSize.width*scale, imgSize.height*scale); UIGraphicsBeginImageContext(scaleSize); [img drawInRect:CGRectMake(0, 0, imgSize.width*scale, imgSize.height*scale)]; UIImage * scaleImg = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return scaleImg; }一樣使用UIGraphicsBeginImageContext構建一個圖形context,只是這裏不是把某個view的layer畫進context,而是使用drawInRect:方法,把傳入的img畫進當前context。參數Rect是用來指定圖片繪製的區域,大小爲圖片本來大小的倍數,這樣繪製進去的圖片就會相應的縮小。經過 UIGraphicsGetImageFromCurrentImageContext()獲取圖片。能夠把context當作畫布,而後圖片是一幅畫,這幅畫畫在了context這個畫布上,而且指定範圍大小。
若是想要達到剪切效果,那麼只須要img調用drawInRect:方法的時候傳入的rect不包含在context的區域裏面就好。好比context的size是(100,100),傳入的rect是(0,0,100,100)的話,恰好截取圖片;若是rect是(0,-50,100,100)的話,那麼圖片就會被截得下半部分。若是rect是(0,0,200,200),那麼恰好圖片左上角1/4的部分被截取。圖片
獲取截圖還有個簡單方法:it
self.imgView.image = [UIImage imageWithCGImage:CGImageCreateWithImageInRect(img.CGImage, CGRectMake(0, 0, 800, 600))];傳入的CGRect值用來指定截圖圖片上的什麼區域,和是截圖相對原圖片的座標區域,和上面截圖方法裏傳入的rect有所不一樣。