2013-07-05 3 views
-2

나는 채도 구현의 코드를 보았다. 나는 그것을 매우 훌륭하게 발견했다. 그러나 나는 또한 이와같이 색조를 구현하고 싶다.픽셀 버퍼를 사용하여 색조를 UIImage에 적용하는 방법은 무엇입니까?

-(UIImage*)doHueAdjustFilterWithBaseImageName:(NSString*)baseImageName hueAdjust:(CGFloat)hueAdjust 
{ 

    CIImage *inputImage = [[CIImage alloc] initWithImage:[UIImage imageNamed:baseImageName]]; 
    CIFilter * controlsFilter = [CIFilter filterWithName:@"CIHueAdjust"]; 
    [controlsFilter setValue:inputImage forKey:kCIInputImageKey]; 

    [controlsFilter setValue:[NSNumber numberWithFloat:hueAdjust] forKey:@"inputAngle"]; 

    NSLog(@"%@",controlsFilter.attributes); 
    CIImage *displayImage = controlsFilter.outputImage; 
    UIImage *finalImage = [UIImage imageWithCIImage:displayImage]; 

    CIContext *context = [CIContext contextWithOptions:nil]; 
    if (displayImage == nil || finalImage == nil) { 
     // We did not get output image. Let's display the original image itself. 
     return [UIImage imageNamed:baseImageName]; 
    }else { 
     // We got output image. Display it. 
     return [UIImage imageWithCGImage:[context createCGImage:displayImage fromRect:displayImage.extent]]; 
    }  
} 

매우 깔끔한, 무슨 일이 일어나고 있는지보고 매우 쉽게 일을 가져옵니다 - 채도의

코드

void filterSaturate(UInt8 *pixelBuf, UInt32 offset, void *context) 
{ 
double t = *((double*)context); 



int r = offset; 
int g = offset+1; 
int b = offset+2; 

int red = pixelBuf[r]; 
int green = pixelBuf[g]; 
int blue = pixelBuf[b]; 

int avg = (red + green + blue)/3; 

pixelBuf[r] = SAFECOLOR((avg + t * (red - avg))); 
pixelBuf[g] = SAFECOLOR((avg + t * (green - avg))); 
pixelBuf[b] = SAFECOLOR((avg + t * (blue - avg))); 
    } 
+0

처음으로 색상을 선택하지 않고 색조 이동을 적용하는 것이 타당하지 않을 수 있습니다. 그러나, 당신이해야 할 일은 HSB (HSV)로 픽셀 색상을 변환하고 H를 변경하는 것입니다. –

답변

1

여기에 알렉스 스톤의 대답 here에서 가져온 중요한 코드입니다.

+0

이 코드에 대해 알고 있지만 실제로 슬라이더의 입력 각도 값을 변경하고 싶습니다. 필터는 처리에 시간이 걸리기 때문에 유창합니다. –

+1

그러면 슬라이더가 슬라이드되어 실시간으로 필터링 된 이미지의 미리보기를 원하십니까? –

+0

예 실시간 미리보기를 원합니다. –