2013-07-05 46 views
-2

我已經看到飽和度的實現代碼,我發現它非常好。但是我想用這種方式來實現色相。飽和的如何使用像素緩衝區在UIImage上應用色相?

碼 -

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採取:

-(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]]; 
    }  
} 

很整齊,很容易看到發生了什麼事,能夠完成任務。

+0

我知道這段代碼,但實際上我想改變滑塊上輸入角度的值,因爲我這樣做不是流暢,因爲過濾器確實需要時間處理。 –

+1

所以,當滑塊滑動時,您希望實時預覽過濾圖像? –

+0

是的,我想要實時預覽。 –

相關問題