在一般使用中,会使用 UImage
或者其他 view
加载某个视图,但是当需要进行某个相关操作的时候,必须要使用到 UIImage
对象去操作,这个时候,最方便的方法就是获取当前UIView(所有view父类)的视图,然后使用代码去生成、写入本地磁盘。当然了还有使用滤镜或者截图直接把需要的范围拿下来就可以了。具体实现代码如下:
// 1. 需要使用Method调用
UIImage *currentImg = [self getImageFromView:self.firstView.drawIV]; //view调用生成image
[self covertPngOrJpgWithImg:currentImg]; //执行写入保存
//2. UIView转成UIImage
-(UIImage *)getImageFromView:(UIView *)view{
UIGraphicsBeginImageContext(view.bounds.size);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
上述 UIView
生成 UIImage
的方法是使用 renderInCotext
绘制,但是当项目中已经存在 GPUImage
即 OpenGL ES
类库时,<font color=#8E236B>上述方法即不可用,因为 renderInContext
和 OpenGL ES
不能同时工作 </font>
下面是在原有基础上的改进方法,同样在二者同时存在时也可工作。
从新启用新的截图方法,使用下面方法渲染view layer图层
+ (UIImage *)captureImgWhenViewIsGPUImageV:(UIView *)view{
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx);
CGContextConcatCTM(ctx, [view.layer affineTransform]);
if ([view respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) {//iOS 7+
[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];
} else {//iOS 6
[view.layer renderInContext:ctx];
}
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
CGContextRestoreGState(ctx);
UIGraphicsEndImageContext();
return image;
}