2012-02-06 54 views
1

我想在我的圖像上應用小插圖和復古圖像過濾器。如何在應用中應用小插曲和復古圖像過濾器

我跟着this sample code

我已經集成了黑色&白色和sephia filters.This代碼還提供了vignette圖像過濾器,但它處理速度非常慢,並且應用程序在應用此過濾器時會碰撞一些小圖像。

請建議我如何實現小插曲和復古圖像過濾器。 任何建議將不勝感激。 在此先感謝!

+0

建議1:找一個你想做的(通過谷歌搜索?)並將其集成到你的代碼的庫。建議2:找出你想要的算法,然後編寫它的代碼。建議3:做好建議1和2,然後發佈與編程問題有關的特定問題。 – 2012-02-06 11:49:06

+0

沒有具體問題。 – 2012-02-06 14:39:59

+0

@NickBull yes已經通過了建議1和2,這就是爲什麼我附加了我所遵循的示例的鏈接。如果您知道實施這些過濾器的相關信息,請提供幫助。 – Gypsa 2012-02-07 03:55:24

回答

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,所以目前我無法過濾比這更大的圖像。我正在努力克服這一限制,但同時您可能需要在處理之前縮小圖像以適應此分辨率限制。

+0

感謝您的答案。我一定會嘗試這個。 – Gypsa 2012-04-19 04:02:30

+0

@brad:Hi..i've用在我的項目相同的代碼,但它說:「在該行 vignetteImageFilter.x = 0.6」屬性x不GPUImageVignetteFilter的對象類型找到」; 和y的同樣的錯誤 – 2013-02-11 08:32:32

+0

@Ajitthala - 這些屬性已將名稱更改爲vignetteEnd和vignetteStart。我更新了上面的代碼以匹配,但您可以在SimpleImageFilter示例應用程序中找到所有這些。 – 2013-02-11 15:40:47

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!) 
} 
相關問題