美文网首页
UIView生成UIImage对象

UIView生成UIImage对象

作者: 罂粟之城 | 来源:发表于2019-08-14 13:33 被阅读0次

    在一般使用中,会使用 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 类库时,<font color=#8E236B>上述方法即不可用,因为 renderInContextOpenGL 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;
    }
    

    相关文章

      网友评论

          本文标题:UIView生成UIImage对象

          本文链接:https://www.haomeiwen.com/subject/gzjgjctx.html