UIView生成UIImage对象

在一般使用中,会使用 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 绘制,但是当项目中已经存在 GPUImageOpenGL ES 类库时,上述方法即不可用,因为 renderInContextOpenGL ES 不能同时工作
下面是在原有基础上的改进方法,同样在二者同时存在时也可工作。

从新启用新的截图方法,使用下面方法渲染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;
}

你可能感兴趣的:(UIView生成UIImage对象)