【问题标题】:How to apply vignette and vintage image filter in app如何在应用程序中应用晕影和复古图像过滤器
【发布时间】:2012-02-06 10:20:03
【问题描述】:

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

我关注了this sample code

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

请建议我如何实现晕影和复古图像过滤器。 任何建议将不胜感激。 提前致谢!

【问题讨论】:

  • 建议 1:找到一个可以满足您需求的库(通过 Google 搜索?)并将其集成到您的代码中。建议2:为你想要的东西制定一个算法,然后为它编写代码。建议 3:尝试执行建议 1 和 2,然后发布与编程问题相关的具体问题。
  • @NickBull 是的,已经通过了建议 1 和 2,这就是为什么我附上了我所遵循的示例的链接。如果您对实现这些过滤器有所了解,请提供帮助。
  • @Warren 我认为这个问题非常具体,晕影效果是几乎所有复古照片效果的一部分,据我所知,还没有人在堆栈上回答这个问题......

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


【解决方案1】:

您可以使用GPUImage 及其 GPUImageSepiaFilter 和 GPUImageVignetteFilter 轻松做到这一点:

上图是使用以下代码生成的:

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 毫秒内运行此过滤器。由于在往返 UIImage 时需要通过 Core Graphics 来回往返,因此静态图像会稍慢一些,但这仍然比 CPU-bound 过滤器快 6 倍。

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

【讨论】:

  • 感谢您的回答。我一定会尝试的。
  • @brad:嗨..我在我的项目中使用了相同的代码,但它在 vignetteImageFilter.x = 0.6 行中显示“在 GPUImageVignetteFilter 的对象类型上找不到属性 x”;并且y 的相同错误
  • @Ajitthala - 这些属性已将名称更改为 vignetteEnd 和 vignetteStart。我已经更新了上面的代码以匹配,但是您可以在 SimpleImageFilter 示例应用程序中找到所有这些。
  • vignetteFilter.x = 0.4;vignetteFilter.y = 0.6;
【解决方案2】:

斯威夫特 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!)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 2012-02-29
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    相关资源
    最近更新 更多