iOS代码生成马赛克效果

1,938 阅读1分钟

1.swift

生成一个UIView的分类

    /// 截屏
    func screenshot() -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, UIScreen.main.scale)
        guard let context = UIGraphicsGetCurrentContext() else { return nil }
        self.layer.render(in: context)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image;
    }
    /// 生成马赛克图片
    func readburnImage() -> UIImage? {
        guard let image = screenshot() else {return nil}
        guard let data = image.pngData() else {return nil}
        
        let pCIImage = CIImage(data: data)
        let pCIContext = CIContext(options: nil)
        let filter = CIFilter(name: "CIPixellate")
        filter?.setValue(pCIImage, forKey: kCIInputImageKey)
        guard let outputImage = filter?.outputImage else {return nil}
        guard let cgimg = pCIContext.createCGImage(outputImage, from: outputImage.extent) else {return nil}
        let newImage = UIImage(cgImage: cgimg)
        return newImage
    }

#2 Objective-C


-(UIImage *)imageWithScreenshot {
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, UIScreen.mainScreen.scale);
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    if (context) {return nil;}
    
    [self.layer renderInContext:context];
    UIImage * image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}



-(UIImage *)imageWithMosaic {
    // 截屏
    UIImage * image = [self imageWithScreenshot];
    NSData * data = UIImagePNGRepresentation(image);
    //创建CIImage对象
    CIImage * pCIImage = [CIImage imageWithData:data];
    // 创建基于GPU的CIContext对象
    CIContext * pCIContext = [CIContext contextWithOptions:nil];
    // 创建过滤器
    CIFilter * filter = [CIFilter filterWithName:@"CIPixellate"];
    // 设置过滤器参数
    [filter setValue:pCIImage forKey:kCIInputImageKey];
    // 得到过滤后的图片
    CIImage *otImage = [filter outputImage];
    // 转成cg
    CGImageRef cgImage = [pCIContext createCGImage:otImage fromRect:[otImage extent]];
    // UIimage
    UIImage * newImage = [UIImage imageWithCGImage:cgImage];
    // release
    CGImageRelease(cgImage);
    return newImage;
}