2012-02-27 3 views
6

UIImage의 색상/색조를 변경하는 방법을 찾으려고합니다. iOS5에 많은 이미지 필터가 있다는 것을 알았지 만, CIColorMatrix 필터의 올바른 사용에 대한 문서를 찾는 데 어려움이 있습니다.iOS5에서 CIColorMatrix를 사용하는 방법?

-(void)doCIColorMatrixFilter 
{ 

    //does not work, returns nil image 
    CIImage* inputImage = [CIImage imageWithCGImage:[[UIImage imageNamed:@"button.jpg"]CGImage]]; 

    CIFilter *myFilter; 
    NSDictionary *myFilterAttributes; 
    myFilter = [CIFilter filterWithName:@"CIColorMatrix"]; 
    [myFilter setDefaults]; 

    myFilterAttributes = [myFilter attributes]; 

    [myFilterAttributes setValue:inputImage forKey:@"inputImage"]; 
    //How to set up attributes? 

    CIContext *context = [CIContext contextWithOptions:nil]; 
    CIImage *ciimage = [myFilter outputImage]; 
    CGImageRef cgimg = [context createCGImage:ciimage fromRect:[ciimage extent]]; 
    UIImage *uimage = [UIImage imageWithCGImage:cgimg scale:1.0f orientation:UIImageOrientationUp]; 
    [imageView setImage:uimage]; 
    CGImageRelease(cgimg); 

} 

어떤 코드가이 필터의 사전에 포함됩니까? 1에서

우리가를 만듭니다

답변

20

한 달 후 ...

모든 매개 변수 :

-(void)doCIColorMatrixFilter 
{ 
    // Make the input image recipe 
    CIImage *inputImage = [CIImage imageWithCGImage:[UIImage imageNamed:@"facedetectionpic.jpg"].CGImage]; // 1 

    // Make the filter 
    CIFilter *colorMatrixFilter = [CIFilter filterWithName:@"CIColorMatrix"]; // 2 
    [colorMatrixFilter setDefaults]; // 3 
    [colorMatrixFilter setValue:inputImage forKey:kCIInputImageKey]; // 4 
    [colorMatrixFilter setValue:[CIVector vectorWithX:1 Y:1 Z:1 W:0] forKey:@"inputRVector"]; // 5 
    [colorMatrixFilter setValue:[CIVector vectorWithX:0 Y:1 Z:0 W:0] forKey:@"inputGVector"]; // 6 
    [colorMatrixFilter setValue:[CIVector vectorWithX:0 Y:0 Z:1 W:0] forKey:@"inputBVector"]; // 7 
    [colorMatrixFilter setValue:[CIVector vectorWithX:0 Y:0 Z:0 W:1] forKey:@"inputAVector"]; // 8 

    // Get the output image recipe 
    CIImage *outputImage = [colorMatrixFilter outputImage]; // 9 

    // Create the context and instruct CoreImage to draw the output image recipe into a CGImage 
    CIContext *context = [CIContext contextWithOptions:nil]; 
    CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]]; // 10 

    // Draw the image in screen 
    UIImageView *imageView2 = [[UIImageView alloc] initWithImage:[UIImage imageWithCGImage:cgimg]]; 
    CGRect f = imageView2.frame; 
    f.origin.y = CGRectGetMaxY(imageView.frame); 
    imageView2.frame = f; 

    [self.view addSubview:imageView2]; 
} 

설정 CIColorMatrix의 예 그래서이 샘플이하는 일입니다 ciimage, 당신이 거기에없는 경우 오른쪽 UIImage/CGImage 또는 경로를 전달하는지 확인하십시오. 필터를 만들 2에서

, 당신은이 : 3에서

가 기본값으로 필터 매개 변수를 설정 알고, CoreImage에 프로그래밍 가이드 (나는 이상한/나쁜 일 경우를 실험하지 않은 있지만, 우리는이 작업을 수행해야합니다 제안). 피할 4에서

우리가 매개 변수를 설정 8을 통해 5에서

ciimage 입력을 설정합니다. 예를 들어 이미지가 붉은 색으로 보이도록 빨간 벡터 {1,1,1,0}을 만들었습니다. 6, 78 아니라 그 값은 기본값이 (우리가 -setDefaults라고 기억?)로 동일하기 때문에 여기에 필요한 있지만, 나는 그들이 잘 추측 교육 목적 : 아니지만 9, 출력 이미지를 설정

아직 그려져 있지 않다.

마지막으로 10에서 CoreImage에 출력 이미지를 CGImage로 그려 넣고 그 CGImage를 UIImage에 넣고 UIImageView에 넣습니다.

Reddish

는 희망이 도움이 :

는 결과 (나는 this 튜토리얼과 같은 이미지를 사용)입니다. 체인

+0

위대한 답변입니다. # 1 쪽지가있는 쪽지. 때때로 ciimage는 이미지 유형 때문에 nil입니다. 때로는 cgimage를 생성 한 다음 그 이미지를 ciimage로 만드는 것이 필요합니다. – Aggressor

+0

@Aggressor ciimage에 nil을 반환하는 이미지 유형의 예를 들어 주시겠습니까? 답변 주소를 편집하고 싶습니다 :) – nacho4d

+0

3을 설명하는 기사가 있습니다. https://medium.com/@ranleung/uiimage-vs-ciimage-vs-cgimage-3db9d8b83d94.알려진 유형 (예 : .jpg)으로 작업하는 경우 CIImage를 사용한다는 것을 항상 알고 있다면 안전합니다. 그러나 응용 프로그램에서 여러 형식의 파일 형식을 사용하는 경우 CIImage가 nil 일 때 대신 CGImage를 가져 와서 CIImage로 변환해야합니다 (즉, 컨텍스트에서 다시 그릴 수 있고 UIImage-> CIImage를 가져올 수 있음)) – Aggressor

5

단지 신속 예 디폴트임을 nacho4d

var output = CIFilter(name: "CIColorControls") 
output.setValue(ciImage, forKey: kCIInputImageKey) 
output.setValue(1.8, forKey: "inputSaturation") 
output.setValue(0.01, forKey: "inputBrightness") 

filter = CIFilter(name: "CIColorMatrix") 
filter.setDefaults() 
filter.setValue(output.outputImage, forKey: kCIInputImageKey) 
filter.setValue(CIVector(x: 1, y: 0.1, z: 0.1, w: 0), forKey: "inputRVector") 
filter.setValue(CIVector(x: 0, y: 1, z: 0, w: 0), forKey: "inputGVector") 
filter.setValue(CIVector(x: 0, y: 0, z: 1, w: 0), forKey: "inputBVector") 

참고하여 상기 답변에 추가 1,0,0 0,1,0 및 RGB의 각각에 0,0,1 및 당신이 그것을 더 붉은 색으로 만들고 싶다면 inputRVector를 1,1,1로 설정하고 나머지는 똑같이 두십시오 (이것은 빨강과 파랑의 값을 빨강과 파랑으로 곱합니다)