アプリでビネットとヴィンテージ画像フィルタを適用する方法

ビネットとヴィンテージの画像フィルタを画像に適用したい

私はこのサンプルコードに従っています。

I have integrated black &white and sephia filters.This code also provides vignette image filter but it processes it very slow and also app gets crashed for some small images when applying this filter.

ビネットとヴィンテージのイメージフィルタを実装する方法を教えてください。 どんな提案も高く評価されます。 前もって感謝します!

1
@Warren私はこの質問がかなり具体的だと思います。ビネットエフェクトはほぼすべてのヴィンテージ写真エフェクトの一部ですが、誰もまだ私が知っているようにその質問に答えました...
追加された 著者 Ondrej,
具体的な質問はありません。
追加された 著者 Warren Burton,
@NickBullは既にsuggestion1と2を行っています。なぜ私がこの例のリンクを付けたのか、なぜこのフィルタを実装するか分かっている場合は、助けてください。
追加された 著者 Gypsa,
提案1:あなたが望むものを(Google検索を介して)行うライブラリを見つけて、それをあなたのコードに統合する。提案2:あなたが望むもののアルゴリズムを見つけて、そのコードを書く。提案3:提案1と2を行い、プログラミング問題に関連する特定の質問を投稿してください。
追加された 著者 Nick Bull,

2 答え

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にバインドされた画像処理ルーチンよりもはるかに高速です。実際には、上記のフィルタをライブビデオに適用することができます。 iPhone 4は640x480ビデオフレームで〜2msでこのフィルタを実行できます。静止画像は、UIImagesとの間でやり取りするときに必要なCore Graphics経由のラウンドトリップのために少し遅くなりますが、CPUバインドされたフィルタよりも最大6倍高速です。

現在の実装での注意点の1つは、A5以外のデバイス(iPhone 3G S、iPhone 4、iPad 1)のテクスチャサイズの制限が2048x2048であるため、現在はそれ以上の画像をフィルタリングできないことです。私はこの限界を克服する方法に取り組んでいますが、その間に、処理前にこの解像度の制限内に収まるように画像を縮小する必要があります。

9
追加された
@Ajitthala - これらのプロパティは名前をvignetteEndとvignetteStartに変更しました。上記のコードを一致させるように更新しましたが、このすべてをSimpleImageFilterサンプルアプリケーションで見つけることができます。
追加された 著者 Brad Larson,
vignetteFilter.x = 0.4; および vignetteFilter.y = 0.6;
追加された 著者 TheTiger,
あなたの答えをありがとう。私は間違いなくこれを試してみます。
追加された 著者 Gypsa,
@brad:こんにちは..私のプロジェクトでは同じコードを使っていましたが、vignetteImageFilter.x = 0.6の "GPUImageVignetteFilterのオブジェクトタイプにProperty xが見つかりません"と書かれています.y
追加された 著者 The X-Coder,

Swift 3. Below the function to apply vintage effect. This function uses 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!)
}
0
追加された