Как применить виньетку и винтажный фильтр изображений в приложении - PullRequest
2 голосов
/ 06 февраля 2012

Я хочу применить к своему изображению фильтры виньетки и винтажного изображения.

Я следовал этому примеру кода .

У меня есть встроенные черно-белые фильтры и фильтры сепии. Этот код также предоставляет фильтр изображений виньетки, но обрабатывает его очень медленно, а также при работе этого фильтра происходит сбой приложения для некоторых небольших изображений.

Подскажите, пожалуйста, как реализовать фильтры виньетки и винтажного изображения. Любые предложения будут высоко оценены. Заранее спасибо!

Ответы [ 2 ]

9 голосов
/ 18 апреля 2012

Вы можете сделать это довольно легко, используя 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, если вы хотите применить фильтр оттенков серого к исходному изображению.

Как видно из названия платформы, все это ускоряется с помощью графического процессора, поэтому оно намного быстрее, чем любые связанные с процессором процедуры обработки изображений. Фактически, вы можете применить вышеупомянутые фильтры к живому видео. IPhone 4 может запустить этот фильтр за ~ 2 мс для видеокадров 640x480. Неподвижные изображения немного медленнее из-за циклического обхода Core Graphics, необходимого при переходе к UIImages и из него, но это все же в 6 раз быстрее, чем фильтры с привязкой к ЦП.

Одно предостережение в отношении текущей реализации заключается в том, что устройства не A5 (iPhone 3G S, iPhone 4, iPad 1) имеют ограничение размера текстуры 2048x2048, поэтому в настоящее время я не могу фильтровать изображения большего размера. Я работаю над тем, как преодолеть это ограничение, но в то же время вам может потребоваться уменьшить масштаб изображения, чтобы он соответствовал этому пределу разрешения перед обработкой.

0 голосов
/ 26 августа 2017

Свифт 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!)
}
...