在iOS中使用CIEdgeWorkfilter

我正在使用核心图像filter,并试图使CIEdgeWorkfilter。 当应用滤镜时,图像变黑。 我是否正确初始化CIFilter?

CIFilter *edgeWork = [CIFilter filterWithName:@"CIEdgeWork" keysAndValues:kCIInputImageKey,filterPreviewImage, @"inputRadius",[NSNumber numberWithFloat:3.0], nil]; 

CIEdgeWork 在 iOS 5.x以上版本的iOS Core Image中不可用 ,因此在尝试使用它时看到黑色图像并不奇怪。

但是,您可以使用我的GPUImage框架中的GPUImageSketchFilter或GPUImageThresholdEdgeDetection来取消同样的效果。 你可以在这个答案中看到第一个filter的结果 。 后面的filter可能更接近苹果通过CIEdgeWork提供的实际效果,因为它们似乎对得到的边缘检测图像进行二值化。

现在可以在iOS9上使用CIEdgeWork和CILineOverlay

CIEdgeWork

也可以使用基于GPUImageSketchFilter的CoreImagefilterSobel Sketch。 FWKSketchFilter

它的内核:

 kernel vec4 sketch(sampler image, float strength){ vec2 d = destCoord(); vec2 bottomLeftTextureCoordinate = samplerTransform(image, d + vec2(-1.0, -1.0)); vec2 topRightTextureCoordinate = samplerTransform(image, d + vec2(1.0, 1.0)); vec2 topLeftTextureCoordinate = samplerTransform(image, d + vec2(-1.0, 1.0)); vec2 bottomRightTextureCoordinate = samplerTransform(image, d + vec2(1.0, -1.0)); vec2 leftTextureCoordinate = samplerTransform(image, d + vec2(-1.0, 0.0)); vec2 rightTextureCoordinate = samplerTransform(image, d + vec2(1.0, 0.0)); vec2 bottomTextureCoordinate = samplerTransform(image, d + vec2(0.0, -1.0)); vec2 topTextureCoordinate = samplerTransform(image, d + vec2(0.0, 1.0)); float bottomLeftIntensity = sample(image, bottomLeftTextureCoordinate).r; float topRightIntensity = sample(image, topRightTextureCoordinate).r; float topLeftIntensity = sample(image, topLeftTextureCoordinate).r; float bottomRightIntensity = sample(image, bottomRightTextureCoordinate).r; float leftIntensity = sample(image, leftTextureCoordinate).r; float rightIntensity = sample(image, rightTextureCoordinate).r; float bottomIntensity = sample(image, bottomTextureCoordinate).r; float topIntensity = sample(image, topTextureCoordinate).r; float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity; float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity; float mag = 1.0 - (length(vec2(h, v))*strength); return vec4(vec3(mag), 1.0);}