iOS 获取屏幕截图和缩放、裁剪图片

龙玄天
2023-12-01
   1、截图:
-(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上的图片,从而获取屏幕截图。

  UIGraphicsBeginImageContext()方法传入唯一参数,是一个CGSize变量,用来指定图形context的大小,所以获取屏幕截图的时候这个size该是屏幕的大小。其实了解了这个过程,就知道这个方法可以获取任意区域的截图,当然是必须当前页面的一部分。你需要截取哪个view的图像,就让这个view的layer调用renderInContext把图形渲染进当前图形context。


2、缩放图片:

-(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的部分被截取。

  获取截图还有个简单方法:

self.imgView.image = [UIImage imageWithCGImage:CGImageCreateWithImageInRect(img.CGImage, CGRectMake(0, 0, 800, 600))];
传入的CGRect值用来指定截图图片上的什么区域,和是截图相对原图片的坐标区域,和上面截图方法里传入的rect有所不同。

 类似资料: