我現在最常用的影像處理App是Instagram,一直想知道它的濾鏡是怎麼做出來,所以先前研究Instagram濾鏡,如今總算讓我有機會自己玩影像處理的程式!才發現原來iOS SDK已經有許多現成的濾鏡可以隨意取用,我就不用再去研究演算法如何如何~
於是乎,我做了一個App來玩,就像Instagram那樣子~
在此我有13個濾鏡(第一個沒有套用濾鏡),可以看到我們只要建立想使用的濾鏡,並設定所需參數,即可輸出有濾鏡效果的影像!
/**
Theme: Using Filter
IDE: Xcode 6
Language: Objective C
Date: 103/10/31
Author: HappyMan
Blog: https://cg2010studio.wordpress.com/
*/
-(UIImage *)filterWithImage:(UIImage *)image index:(NSInteger)index
{
// 創建基於 GPU 的 CIContext 對象
CIContext *context = [CIContext contextWithOptions:nil];
CIImage *ciSourceImage = [[CIImage alloc] initWithImage:image];
CIFilter *filter;
switch (index) {
case 0:
break;
case 1:
filter = [CIFilter filterWithName:@"CIColorControls"];
[filter setValue:ciSourceImage forKey:kCIInputImageKey];
[filter setValue:@(1.1) forKey:kCIInputSaturationKey];
[filter setValue:@(1.1) forKey:kCIInputContrastKey];
[filter setValue:@(0.0) forKey:kCIInputBrightnessKey];
break;
case 2:
filter = [CIFilter filterWithName:@"CIHueAdjust"];
[filter setValue:ciSourceImage forKey:kCIInputImageKey];
[filter setValue:@(0.5) forKey:kCIInputAngleKey];
break;
case 3:
filter = [CIFilter filterWithName:@"CIPhotoEffectInstant"];
[filter setValue:ciSourceImage forKey:kCIInputImageKey];
break;
case 4:
filter = [CIFilter filterWithName:@"CIGammaAdjust"];
[filter setValue:ciSourceImage forKey:kCIInputImageKey];
[filter setValue:@(0.75) forKey:@"inputPower"];
break;
case 5:
filter = [CIFilter filterWithName:@"CILinearToSRGBToneCurve"];
[filter setValue:ciSourceImage forKey:kCIInputImageKey];
break;
case 6:
filter = [CIFilter filterWithName:@"CISRGBToneCurveToLinear"];
[filter setValue:ciSourceImage forKey:kCIInputImageKey];
break;
case 7:
filter = [CIFilter filterWithName:@"CIVibrance"];
[filter setValue:ciSourceImage forKey:kCIInputImageKey];
[filter setValue:@(2.5) forKey:@"inputAmount"];
break;
case 8:
filter = [CIFilter filterWithName:@"CIPhotoEffectProcess"];
[filter setValue:ciSourceImage forKey:kCIInputImageKey];
break;
case 9:
filter = [CIFilter filterWithName:@"CIPhotoEffectFade"];
[filter setValue:ciSourceImage forKey:kCIInputImageKey];
break;
case 10:
filter = [CIFilter filterWithName:@"CIPhotoEffectTransfer"];
[filter setValue:ciSourceImage forKey:kCIInputImageKey];
break;
case 11:
filter = [CIFilter filterWithName:@"CIPhotoEffectMono"];
[filter setValue:ciSourceImage forKey:kCIInputImageKey];
break;
case 12:
filter = [CIFilter filterWithName:@"CIVignette"];
[filter setValue:ciSourceImage forKey:kCIInputImageKey];
[filter setValue:@(1.9) forKey:kCIInputRadiusKey];
[filter setValue:@(1.4) forKey:kCIInputIntensityKey];
break;
default:
break;
}
// 得到過濾後的圖片
CIImage *outputImage = [filter outputImage];
// 轉換圖片
CGImageRef cgImage = [context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *newImage = [UIImage imageWithCGImage:cgImage];
// 釋放 C 對象
CGImageRelease(cgImage);
return newImage;
}
想知道內建有哪些濾鏡嗎?以下程式碼會輸出目前內建的濾鏡名稱:
NSArray *filters = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];
NSLog(@"%@", filters);
[filters count];
NSLog(@"一共有 %li 種 CIFilter 濾鏡效果", [filters count]);
(
CIAccordionFoldTransition,
CIAdditionCompositing,
CIAffineClamp,
CIAffineTile,
CIAffineTransform,
CIAreaHistogram,
CIAztecCodeGenerator,
CIBarsSwipeTransition,
CIBlendWithAlphaMask,
CIBlendWithMask,
CIBloom,
CIBumpDistortion,
CIBumpDistortionLinear,
CICheckerboardGenerator,
CICircleSplashDistortion,
CICircularScreen,
CICode128BarcodeGenerator,
CIColorBlendMode,
CIColorBurnBlendMode,
CIColorClamp,
CIColorControls,
CIColorCrossPolynomial,
CIColorCube,
CIColorCubeWithColorSpace,
CIColorDodgeBlendMode,
CIColorInvert,
CIColorMap,
CIColorMatrix,
CIColorMonochrome,
CIColorPolynomial,
CIColorPosterize,
CIConstantColorGenerator,
CIConvolution3X3,
CIConvolution5X5,
CIConvolution9Horizontal,
CIConvolution9Vertical,
CICopyMachineTransition,
CICrop,
CIDarkenBlendMode,
CIDifferenceBlendMode,
CIDisintegrateWithMaskTransition,
CIDissolveTransition,
CIDivideBlendMode,
CIDotScreen,
CIEightfoldReflectedTile,
CIExclusionBlendMode,
CIExposureAdjust,
CIFalseColor,
CIFlashTransition,
CIFourfoldReflectedTile,
CIFourfoldRotatedTile,
CIFourfoldTranslatedTile,
CIGammaAdjust,
CIGaussianBlur,
CIGaussianGradient,
CIGlassDistortion,
CIGlideReflectedTile,
CIGloom,
CIHardLightBlendMode,
CIHatchedScreen,
CIHighlightShadowAdjust,
CIHistogramDisplayFilter,
CIHoleDistortion,
CIHueAdjust,
CIHueBlendMode,
CILanczosScaleTransform,
CILightenBlendMode,
CILightTunnel,
CILinearBurnBlendMode,
CILinearDodgeBlendMode,
CILinearGradient,
CILinearToSRGBToneCurve,
CILineScreen,
CILuminosityBlendMode,
CIMaskToAlpha,
CIMaximumComponent,
CIMaximumCompositing,
CIMinimumComponent,
CIMinimumCompositing,
CIModTransition,
CIMultiplyBlendMode,
CIMultiplyCompositing,
CIOverlayBlendMode,
CIPerspectiveCorrection,
CIPhotoEffectChrome,
CIPhotoEffectFade,
CIPhotoEffectInstant,
CIPhotoEffectMono,
CIPhotoEffectNoir,
CIPhotoEffectProcess,
CIPhotoEffectTonal,
CIPhotoEffectTransfer,
CIPinchDistortion,
CIPinLightBlendMode,
CIPixellate,
CIQRCodeGenerator,
CIRadialGradient,
CIRandomGenerator,
CISaturationBlendMode,
CIScreenBlendMode,
CISepiaTone,
CISharpenLuminance,
CISixfoldReflectedTile,
CISixfoldRotatedTile,
CISmoothLinearGradient,
CISoftLightBlendMode,
CISourceAtopCompositing,
CISourceInCompositing,
CISourceOutCompositing,
CISourceOverCompositing,
CISRGBToneCurveToLinear,
CIStarShineGenerator,
CIStraightenFilter,
CIStripesGenerator,
CISubtractBlendMode,
CISwipeTransition,
CITemperatureAndTint,
CIToneCurve,
CITriangleKaleidoscope,
CITwelvefoldReflectedTile,
CITwirlDistortion,
CIUnsharpMask,
CIVibrance,
CIVignette,
CIVignetteEffect,
CIVortexDistortion,
CIWhitePointAdjust
)一共有 127 種 CIFilter 濾鏡效果
濾鏡的參數有些定義成常數,有些則要使用字串。
想知道每個濾鏡如何使用嗎?可以輸出其特性:
NSLog(@"%@", [[CIFilter filterWithName:@"CIHueAdjust"] attributes]);
{
CIAttributeFilterCategories = (
CICategoryColorAdjustment,
CICategoryVideo,
CICategoryStillImage,
CICategoryInterlaced,
CICategoryNonSquarePixels,
CICategoryBuiltIn
);
CIAttributeFilterDisplayName = “Hue Adjust";
CIAttributeFilterName = CIHueAdjust;
inputAngle = {
CIAttributeClass = NSNumber;
CIAttributeDefault = 0;
CIAttributeIdentity = 0;
CIAttributeSliderMax = “3.141592653589793″;
CIAttributeSliderMin = “-3.141592653589793″;
CIAttributeType = CIAttributeTypeAngle;
};
inputImage = {
CIAttributeClass = CIImage;
CIAttributeType = CIAttributeTypeImage;
};
}
以CIHueAdjust為例的參數有兩個:inputAngle和inputImage。
想知道影像套用濾鏡後的效果圖嗎?可以直接參考官方的Core Image Filter。
再做一個後台就能變成社群影像分享平台囉~
參考:使用 CIFilter 對影像製作復古效果的褐色調、查閱目前在 iOS 上 CIFilter 能使用的濾鏡效果方法、使用 CoreImage Framework 實作色相轉換、Core Image Filter Reference、Core Image 介紹: 圖像濾鏡應用。



隨意留個言吧:)~