2013-07-29 3 views
5

전적으로 CIImage 필터를 사용하여 컬러 마스크와 비슷한 것을 얻으려고합니다.CIImage를 사용하여 모든 검정색 픽셀을 투명하게 만듭니다.

기본적으로 모든 검정색 픽셀을 투명하게 만들려고합니다. 나는 비 알파 픽셀들이 어떤 색깔을 가지는지 신경 쓰지 않는다. 최대 알파를 가지고있는 한.

나는이 보일 것이다 달성의 핵심 그래픽을 잘 알고있어 코드처럼 : 나는 그것을 컬러 매트릭스 필터를 사용하여 코어 이미지의 기회를 부여했지만 그것은 단지 nilresult을 설정

// Convert black sections to transparent using a color mask 
const CGFloat maskingColors[6] = { 0, 0, 0, 0, 0, 0 }; 
CGImageRef result = CGImageCreateWithMaskingColors(image, maskingColors); 

CIVector 값이 1.0f보다 크기 때문입니다.

// Create color matrix filter 
CIFilter *matrix = [CIFilter filterWithName:@"CIColorMatrix"]; 

// Set filter properties 
[matrix setValue:image forKey:kCIInputImageKey]; 
[matrix setValue:[CIVector vectorWithX:1.0f Y:0.0f Z:0.0f W:0.0f] forKey:@"inputRVector"]; 
[matrix setValue:[CIVector vectorWithX:0.0f Y:1.0f Z:0.0f W:0.0f] forKey:@"inputGVector"]; 
[matrix setValue:[CIVector vectorWithX:0.0f Y:0.0f Z:1.0f W:0.0f] forKey:@"inputBVector"]; 
[matrix setValue:[CIVector vectorWithX:255.0f Y:255.0f Z:255.0f W:0.0f] forKey:@"inputAVector"]; 

// Get the mapped image 
CIImage *result = [matrix valueForKey:kCIOutputImageKey]; 

참고 : 이것이 가치있는 부분은 OSX 응용 프로그램입니다. A (심플)을 사용하여 사용자 CIFilter

+0

당신이 그것을 필요하십니까 간단한 해결책 또는 가장 빠른 것? 그런 문제를 한 번 겪었으므로 위에 투명 픽셀을 그릴 수 없기 때문에 빠른 이미지 다시 그리기를 위해 OpenGL을 사용하는 것이 좋습니다. – Mehdzor

+0

지금은 간단한 해결책이지만, OpenGL에 대한 힌트가 있다면 좋을 것입니다. 이상적으로 우리는이 질문의 범위를 위해 CIImage 내의 모든 것을 유지해야합니다 (다른 사람들도 도울 수 있도록). –

+0

'CIFilter''CIMaskToAlpha' 또는'CIColorMap'을 보셨습니까? –

답변

5

EDIT

솔루션.

CIFilter 서브 클래스 (Apple's How-To의 더 많거나 적은 사본) :

#import <QuartzCore/QuartzCore.h> 

@interface MaskFilter : CIFilter { 
    CIImage *inputImage; 
} 

@end 

@implementation MaskFilter 

static CIKernel *maskFilterKernel = nil; 

+ (void)initialize { 
    [CIFilter registerFilterName: @"MaskFilter" 
        constructor: (id)self 
       classAttributes: [NSDictionary dictionaryWithObjectsAndKeys: 
            @"Mask Filter", kCIAttributeFilterDisplayName, 
            [NSArray arrayWithObjects: 
            kCICategoryColorAdjustment, 
            kCICategoryStillImage, kCICategoryInterlaced, 
            kCICategoryNonSquarePixels,nil], kCIAttributeFilterCategories, 
            nil] 
    ]; 
} 

+ (CIFilter *)filterWithName:(NSString *)name { 
    CIFilter *filter; 
    filter = [[self alloc] init]; 
    return filter; 
} 

- (id)init { 
    if(maskFilterKernel == nil) { 
     NSBundle *bundle = [NSBundle bundleForClass:[self class]]; 
     NSString *code = [NSString stringWithContentsOfFile:[bundle pathForResource:@"MaskFilter" ofType: @"cikernel"] encoding:NSUTF8StringEncoding error:nil]; 
     NSArray *kernels = [CIKernel kernelsWithString:code]; 
     maskFilterKernel = [kernels objectAtIndex:0]; 
    } 
    return [super init]; 
} 

- (CIImage *)outputImage { 
    CISampler *src = [CISampler samplerWithImage: inputImage]; 
    return [self apply:maskFilterKernel, src, kCIApplyOptionDefinition, [src definition], nil]; 
} 

@end 

사용자 정의 커널 모든 작업 (파일 이름 않습니다 아이폰 OS 사용자 정의 필터를 지원하지 않기 때문에이 방법은, OSX에서 작동합니다 :

CIFilter *filter = [MaskFilter filterWithName:@"MaskFilter"]; 
[filter setValue:ciImage forKey:@"inputImage"]; 
CIImage *mask = [filter valueForKey: @"outputImage"]; 
: MaskFilter.cikernel) 필터를 사용하여

kernel vec4 maskFilterKernel(sampler src) 
{ 
    vec4 t = sample(src, destCoord()); 
    t.w = (t.x == 0.0 ? (t.y == 0.0 ? (t.z == 0.0 ? 0.0 : 1.0) : 1.0) : 1.0); 
    return t; 
} 

그냥 빌드 - 필터처럼 작동

마스크 색상으로 사용할 색상을 선택하는 매개 변수를 추가해도 문제가 없습니다.

OLD 답변 내장 방법 및 클래스와

, 난 단지 (단지 코어 이미지 필터를 사용하는)이 아니라 unelegant 솔루션을 가지고 올 수 :

// convert all colors so they are brighter or equal to 0.5, except black 
CIFilter *binary = [CIFilter filterWithName:@"CIColorMatrix"]; 
[binary setValue:inputImage forKey:@"inputImage"]; 
[binary setValue:[CIVector vectorWithX:1 Y:1 Z:1 W:0] forKey:@"inputRVector"]; 
[binary setValue:[CIVector vectorWithX:1 Y:1 Z:1 W:0] forKey:@"inputGVector"]; 
[binary setValue:[CIVector vectorWithX:1 Y:1 Z:1 W:0] forKey:@"inputBVector"]; 
[binary setValue:[CIVector vectorWithX:0.49999 Y:0.49999 Z:0.49999 W:0] forKey:@"inputBiasVector"]; 
inputImage = [binary valueForKey:@"outputImage"]; 

// convert to black/white only colors 
binary = [CIFilter filterWithName:@"CIColorPosterize"]; 
[binary setDefaults]; 
[binary setValue:inputImage forKey:@"inputImage"]; 
[binary setValue:@2 forKey:@"inputLevels"]; 
inputImage = [binary valueForKey:@"outputImage"]; 

// get mask 
CIFilter *mask = [CIFilter filterWithName:@"CIMaskToAlpha"]; 
[mask setDefaults]; 
[mask setValue: inputImage forKey:@"inputImage"]; 
+0

감사합니다. 사용자 정의 필터가 나를위한 가능성의 세계를 열었습니다 :) CIAreaMaximumAlpha와 같은 단일 픽셀 결과를 출력하는 사용자 정의 필터를 만드는 방법에 대한 힌트가 있습니까? –

+0

출력 크기를 입력 크기와 다른 값으로 정의 할 수 있습니다.그러나 Core Image는 동적 루프 (컴파일 타임 조건의 루프 만 지원)를 지원하지 않으므로 단계 간 정보 손실없이 스마트 한 축소를 고려해야합니다. [이 기사의 섹션 26.2.2] (http://http.developer.nvidia.com/GPUGems3/gpugems3_ch26.html)를보십시오. –

관련 문제