1

Core Image フィルターを使用しており、CIEdgeWork フィルターを作成しようとしています。フィルタが適用されると、画像は黒くなります。CIFilter を正しく初期化していますか?

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

2 に答える 2

3

CIEdgeWorkは、iOS5.x以降のiOSのCoreImageでは使用できないため、使用しようとすると黒い画像が表示されるのは当然です。

ただし、GPUImageフレームワークのGPUImageSketchFilterまたはGPUImageThresholdEdgeDetectionを使用して、これと同じ効果を引き出すことができます。この回答で最初のフィルターの結果を確認できます。後者のフィルターは、結果として得られるエッジ検出画像を2値化するように見えることを考えると、AppleがCIEdgeWorkを介して提供する実際の効果に近い可能性があります。

于 2012-08-05T22:41:43.077 に答える
1

CIEdgeWork と CILineOverlay が iOS9 で利用可能になりました

CIEdgeWork

また、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);}
于 2016-08-04T20:24:39.863 に答える