如何在应用程序中应用晕影和复古图像过滤器

时间:2012-02-06 10:20:03

标签: objective-c iphone swift image-processing uiimage

我想在我的图像上应用晕影和复古图像滤镜。

我跟着this sample code

我已经集成了黑白和sephia滤镜。此代码还提供了晕影图像滤镜,但它处理速度非常慢,并且在应用此滤镜时app也会因某些小图像而崩溃。

请建议我如何实现晕影和复古图像滤镜。 任何建议将受到高度赞赏。 提前谢谢!

2 个答案:

答案 0 :(得分:9)

使用GPUImage及其GPUImageSepiaFilter和GPUImageVignetteFilter可以相当轻松地完成此操作:

Sepia and vignette filtered image

使用以下代码生成上述图像:

UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"];

GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage];
GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init];
GPUImageVignetteFilter *vignetteImageFilter = [[GPUImageVignetteFilter alloc] init];
vignetteImageFilter.vignetteEnd = 0.6;
vignetteImageFilter.vignetteStart = 0.4;

[stillImageSource addTarget:stillImageFilter];
[stillImageFilter addTarget:vignetteImageFilter];
[stillImageSource processImage];

UIImage *filteredImage = [vignetteImageFilter imageFromCurrentlyProcessedOutput];

如果您希望将灰度滤镜应用于源图像,还有一个GPUImageGrayscaleFilter。

正如框架名称所示,这是所有GPU加速的,因此它比任何CPU绑定的图像处理例程快得多。实际上,您可以将上述过滤器应用于实时视频。对于640x480视频帧,iPhone 4可在~2 ms内运行此滤镜。静止图像有点慢,因为往返于UIImages时需要通过Core Graphics的往返行程,但这仍然比CPU绑定过滤器快6倍。

目前实施的一个警告是,非A5设备(iPhone 3G S,iPhone 4,iPad 1)的纹理大小限制为2048x2048,因此我目前无法过滤大于此值的图像。我正在努力克服这一限制,但与此同时,您可能需要在处理之前缩小图像以适应此分辨率限制。

答案 1 :(得分:0)

Swift 3 。下面的功能应用复古效果。此功能使用Core Image

使用Core Image Filters对图片应用任何效果。

func processVintageImage(_ image: UIImage) -> UIImage {

    guard let inputImage = CIImage(image: image) else { return image }

    guard let photoFilter = CIFilter(name: "CIPhotoEffectInstant",
                                     withInputParameters: ["inputImage" : inputImage]),
        let photoOutput = photoFilter.outputImage,
        let sepiaFilter = CIFilter(name: "CISepiaTone",
                                   withInputParameters: ["inputImage": photoOutput]),
        let sepiaFilterOutput = sepiaFilter.outputImage,
        let vignetteFilter = CIFilter(name: "CIVignette",
                                      withInputParameters: ["inputImage": sepiaFilterOutput, "inputRadius" : 1.5, "inputIntensity" : 4.0]),
        let vignetteFilterOutput = vignetteFilter.outputImage else { return image }

    let context = CIContext(options: nil)

    let cgImage = context.createCGImage(vignetteFilterOutput, from: inputImage.extent)

    return UIImage(cgImage: cgImage!)
}