2013-10-02 138 views
2

我寫了一個方法來篩選具有亮度因子和對比度因子的圖像如下:如何通過GPUImage調整圖像的亮度和對比度?

- (UIImage*)image:(UIImage*)image withBrightness:(float)brightness contrast:(float)contrast{ 
    GPUImagePicture *imagePicture = [[GPUImagePicture alloc] initWithImage:image]; 
    GPUImageBrightnessFilter *brightnessFilter = [[GPUImageBrightnessFilter alloc] init]; 
    GPUImageContrastFilter *contrastFilter = [[GPUImageContrastFilter alloc] init]; 

    [imagePicture addTarget:brightnessFilter]; 
    [brightnessFilter addTarget:contrastFilter]; 

    brightnessFilter.brightness = brightness; // set brightness 
    contrastFilter.contrast = contrast;  // set contrast 

    [imagePicture processImage]; 
    UIImage *filteredImage = [contrastFilter imageFromCurrentlyProcessedOutput]; 
    return filteredImage; 
} 

調用此實現將引發錯誤:<Error>: CGContextDrawImage: invalid context 0x0

如何使用GPUImage正確實現亮度和對比度調整?

+2

這看起來是正確的,雖然創建每次你需要處理的是要引入一些開銷圖像時新的亮度和對比度過濾器。對於實時操作,我也不會推薦通過UIImage傳入和傳出,或者(我會使用GPUImageView進行實時預覽),但我不知道您需要的其餘部分。這是來自存儲庫的最新代碼嗎?哪種方法觸發了CGContextDrawImage錯誤,GPUImagePicture分配還是最終提取圖像? –

+0

感謝@BradLarson和您的超棒圖書館!我發現圖像參數是空的,所以它引發了錯誤。 –

回答

0

你應該創建一組過濾器,檢查此示例代碼

GPUImageFilterGroup *groupFilter = [[GPUImageFilterGroup alloc]init]; 
    [groupFilter addTarget:edit.currentFilter]; 

    //create a brightness filter 
    GPUImageBrightnessFilter *brightnessFilter = [[GPUImageBrightnessFilter alloc]init]; 
    [brightnessFilter setBrightness:brightnessValue]; 

    //create a contrast filter 
    GPUImageContrastFilter *contrastFilter = [[GPUImageContrastFilter alloc]init]; 
    [contrastFilter setContrast:contrastValue]; 

    //create a exposure filter 
    GPUImageExposureFilter *exposureFilter =[[GPUImageExposureFilter alloc]init]; 
    [exposureFilter setExposure:exposureValue]; 

    //add brightness,contrast,exposure filters to group filter 
    [groupFilter addFilter:brightnessFilter]; 
    [groupFilter addFilter:contrastFilter]; 
    [groupFilter addFilter:exposureFilter]; 


    [edit.currentFilter addTarget:brightnessFilter]; 
    [brightnessFilter addTarget: contrastFilter]; 
    [contrastFilter addTarget: exposureFilter]; 
    //setting initial and terminal filters 
    [(GPUImageFilterGroup *) groupFilter setInitialFilters:[NSArray arrayWithObject:edit.currentFilter]]; 
    [(GPUImageFilterGroup *) groupFilter setTerminalFilter:exposureFilter]; 


    //apply it to the GPUImagePicture 
+0

謝謝。但是,什麼是'edit.currentFilter',如果我沒有一個呢? –

+0

我還是':CGContextDrawImage:invalid context 0x0'。 [這是我的新代碼](http://codepad.org/Cw5Zfdk7)使用組過濾器。我做錯了嗎? –

+0

currentFilter屬性和編輯是同一類的弱引用 @property(nonatomic,strong)GPUImageOutput * currentFilter; __weak EditViewController * edit = self; – vin

相關問題