说明:
1. 通过滤镜名称创建滤镜
2. OSX特有的处理,这里删掉了。
3. 将效果的中心点设置在图像的中心位置。
4. 设置扭曲的半径为100。
5. 将输入标量设置为3。输入标量定义了效果的方向和数量。
(原文:The input scale specifies the direction and the amount of the effect. )
缺省值是-0.5。范围是-10.0到10.0。0是没有效果。负值会创建一个向外扭曲的效果。正值向内扭曲。
效果:
2 获得脸和脸部特征界限
脸部特征包括:
- 左右眼睛的位置
- 嘴巴的位置
- 跟踪ID和跟踪帧数(Core Image 以此来跟踪视频断中的脸)(available in iOS v6.0 and later and in OS X v10.8 and later)
在你通过CIDetector对象获得一个脸部特征数据的array后,你可以循环这个array来检测每张脸的边界及其特性。
for (CIFaceFeature *f in features)
{
NSLog(NSStringFromRect(f.bounds));
if (f.hasLeftEyePosition)
printf("Left eye %g %g\n", f.leftEyePosition.x, f.leftEyePosition.y);
if (f.hasRightEyePosition)
printf("Right eye %g %g\n", f.rightEyePosition.x, f.rightEyePosition.y);
if (f.hasmouthPosition)
printf("Mouth %g %g\n", f.mouthPosition.x, f.mouthPosition.y);
}
三 自动增强图像
Core Image的自动增强特性分析图像的直方图,脸部区域内容,和元数据属性。之后返回一个CIFilter对象的array,这些对象的参数已经被设置好,用来增强被分析的图像。
(Auto enhancement is available in iOS v5.0 and later and in OS X v10.8 and later)
创建一个Chroma Key滤镜需要以下操作:
- Create a cube map of data that maps the color values you want to remove so they are transparent (alpha value is 0.0). 不会翻译了-_-|||,大概意思是会把要过滤掉的颜色,设置为透明色。
- Use the CIColorCube filter and the cube map to remove chroma-key color from the source image.使用CIColorCube滤镜和cube map从原图上删除浓度-键颜色。
// Populate cube with a simple gradient going from 0 to 1
for (int z = 0; z < size; z++){
rgb[2] = ((double)z)/(size-1); // Blue value
for (int y = 0; y < size; y++){
rgb[1] = ((double)y)/(size-1); // Green value
for (int x = 0; x < size; x ++){
rgb[0] = ((double)x)/(size-1); // Red value
// Convert RGB to HSV
// You can find publicly available rgbToHSV functions on the Internet
rgbToHSV(rgb, hsv);
// Use the hue value to determine which to make transparent
// The minimum and maximum hue angle depends on
// the color you want to remove
float alpha = (hsv[0] > minHueAngle && hsv[0] < maxHueAngle) ? 0.0f:
1.0f;
// Calculate premultiplied alpha values for the cube
c[0] = rgb[0] * alpha;
c[1] = rgb[1] * alpha;
c[2] = rgb[2] * alpha;
c[3] = alpha; // c的指针不移动???
}
}
}
// Create memory with the cube data
NSData *data = [NSData dataWithBytesNoCopy:cubeData
length:cubeDataSize
freeWhenDone:YES];
CIColorCube *colorCube = [CIFilter filterWithName:@"CIColorCube"];
[colorCube setValue:[NSNumber numberWithInt:size] forKey:@"inputCubeDimension"];
// Set data for cube
[colorCube setValue:data forKey:@"inputCubeData"];
12 创建线性梯度
从一个单色(如绿色或灰色)创建一个线性梯度,从上倒下变化。
如下设置CILinearGradient的输入参数:
● Set inputPoint0 to (0, 0.75 * h)
● Set inputColor0 to (0,1,0,1)
● Set inputPoint1 to (0, 0.5*h)
● Set inputColor1 to (0,1,0,0)
创建一个绿色线性梯度,从上到下变化。
如下设置CILinearGradient的输入参数:
● Set inputPoint0 to (0, 0.25 * h)
● Set inputColor0 to (0,1,0,1)
● Set inputPoint1 to (0, 0.5*h)
● Set inputColor1 to (0,1,0,0)
你应该通读性能最佳实践 (performance best practices),以确保您的app能够高效地运行。
1 性能最佳实践
如下来实践最佳性能:
- 不要每次渲染都创建一个CIContext对象
上下文中保存了大量的状态信息;重用他们会更加高效。
- 评估一下你的app是否需要颜色管理。如果你不需要就不要使用它。
- 使用GPU上下文渲染CIImage对象时,避免Core Animation的动画。
- 保证图像不超过CPU和GPU的限制。
Core Image 使用CPU或者GPU时CIContext对图像大小的限制是不同的。
通过inputImageMaximumSize和outputImageMaximumSize来获得限制的实际值。
- 尽可能使用小图像。
性能会随着输出的像素数增加。你可以让Core Image渲染到一个小的视图,质地,或者帧缓冲区。
Allow Core Animation to upscale to display size.
使用Core Graphics或Image I/O函数来剪切或者采样,比如
CGImageCreateWithImageInRect 或者 CGImageSourceCreateThumbnailAtIndex。
● UIImageView类最适合处理静态图像。
如果你的app要获得最佳性能,请使用底层API。
● 避免CPU和GPU之间不必要的质地转换。
●
Render to a rectangle that is the same size as the source image before applying a contents scale factor.
● 考虑使用能达到近似于算法滤镜效果的简单滤镜。
比如,CIColorCube能产生与CISepiaTone近似的输出,并且更高效。
● Take advantage of the support for YUV image in iOS v6.0 and later.
Camera pixel buffers are natively YUV but most image processing algorithms expect RBGA data. There is a cost to converting between the two. Core Image supports reading YUB from CVPixelBuffer objects and applying the appropriate color transform.
YUV, YUB是神码?
八 在实现一个自定义滤镜前,你需要知道的几件事
OS X provides support for writing custom filters.
iOS不支持,略过。
九 创建自定义滤镜
On OS X, if the filters provided by Core Image don’t provide the functionality you need, you can write your own filter. (Custom filters are not available on iOS.)
iOS不支持,略过。
十 打包和加载图像单元
An image unit represents the plug-in architecture for Core Image filters. Image units use the NSBundle class as the packaging mechanism to allow you to make the filters that you create available to other apps. An image unit can contain filters that are executable or nonexecutable. (See “Executable and Nonexecutable Filters” (page
69) for details.)