我正在使用Core Image过滤器并尝试制作CIEdgeWork过滤器。应用滤镜后,图像变黑。我正确地初始化CIFilter。
CIFilter *edgeWork = [CIFilter filterWithName:@"CIEdgeWork"
keysAndValues:kCIInputImageKey,filterPreviewImage,
@"inputRadius",[NSNumber numberWithFloat:3.0],
nil];
答案 0 :(得分:3)
但是,您可以使用我的GPUImage框架中的GPUImageSketchFilter或GPUImageThresholdEdgeDetection来实现相同的效果。您可以在this answer中查看第一个过滤器的结果。后一种过滤器可能更接近Apple通过CIEdgeWork提供的实际效果,因为它们似乎将得到的边缘检测图像二值化。
答案 1 :(得分:1)
现在CIEdgeWork和CILineOverlay可用于iOS9
您还可以使用基于GPUImageSketchFilter的CoreImage过滤器Sobel 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);}