2016-05-03 1 views
3

Я работаю над GPUImage Библиотека. Я установил, что этот фильтр будет применен к методу Collectionview didselectitematindexpath. Это мой первый проект, основанный на библиотеке GPUImage. Я успешно могу применить Filter on GPUImageview, но для применения фильтра потребуется много времени. Пожалуйста, помогите мне, как я могу сделать это быстро.GPUImage Найдите время, чтобы применить фильтр

Вот мой код,

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
     [filter removeAllTargets]; 

    if (indexPath.row==0) { 
     NSLog(@"Normal Filter"); 
    } 
    else if (indexPath.row==1) 
    { 
     filter = [[GPUImageSepiaFilter alloc] init]; 

    } 
    else if (indexPath.row==2) 
    { 
     filter = [[GPUImagePixellateFilter alloc] init]; 

    } 
    else if (indexPath.row==3) 
    { 
     filter = [[GPUImagePixellatePositionFilter alloc] init]; 

    } 
    else if (indexPath.row==4) 
    { 
     filter = [[GPUImagePolkaDotFilter alloc] init]; 

    } 
    else if (indexPath.row==5) 
    { 
     filter = [[GPUImageHalftoneFilter alloc] init]; 

    } 
    else if (indexPath.row==6) 
    { 
     filter = [[GPUImageCrosshatchFilter alloc] init]; 

    } 
    else if (indexPath.row==7) 
    { 
     filter = [[GPUImageColorInvertFilter alloc] init]; 

    } 
    else if (indexPath.row==8) 
    { 
     filter = [[GPUImageGrayscaleFilter alloc] init]; 

    } 
    else if (indexPath.row==9) 
    { 
     filter = [[GPUImageMonochromeFilter alloc] init]; 
     [(GPUImageMonochromeFilter *)filter setColor:(GPUVector4){0.0f, 0.0f, 1.0f, 1.f}]; 
    } 
    else if (indexPath.row==10) 
    { 
     filter = [[GPUImageFalseColorFilter alloc] init]; 

    } 
    else if (indexPath.row==11) 
    { 
     filter = [[GPUImageSoftEleganceFilter alloc] init]; 

    } 
    else if (indexPath.row==12) 
    { 
     filter = [[GPUImageMissEtikateFilter alloc] init]; 

    } 
    else if (indexPath.row==13) 
    { 
     filter = [[GPUImageAmatorkaFilter alloc] init]; 

    } 
    else if (indexPath.row==14) 
    { 
     filter = [[GPUImageSaturationFilter alloc] init]; 
     [(GPUImageSaturationFilter *)filter setSaturation:2.0]; 
    } 
    else if (indexPath.row==15) 
    { 
     filter = [[GPUImageContrastFilter alloc] init]; 
     [(GPUImageContrastFilter *)filter setContrast:1.5]; 


    } 
    else if (indexPath.row==16) 
    { 
     filter = [[GPUImageBrightnessFilter alloc] init]; 
     [(GPUImageBrightnessFilter *)filter setBrightness:0.6]; 


    } 
    else if (indexPath.row==17) 
    { 
     filter = [[GPUImageLevelsFilter alloc] init]; 

    } 
    else if (indexPath.row==18) 
    { 
     filter = [[GPUImageRGBFilter alloc] init]; 

    } 
    else if (indexPath.row==19) 
    { 
     filter = [[GPUImageHueFilter alloc] init]; 

    } 
    else if (indexPath.row==20) 
    { 
     filter = [[GPUImageWhiteBalanceFilter alloc] init]; 

    } 
    else if (indexPath.row==21) 
    { 
     filter = [[GPUImageExposureFilter alloc] init]; 

    } 
    else if (indexPath.row==22) 
    { 
     filter = [[GPUImageSharpenFilter alloc] init]; 

    } 
    else if (indexPath.row==23) 
    { 
     filter = [[GPUImageUnsharpMaskFilter alloc] init]; 

    } 
    else if (indexPath.row==24) 
    { 
     filter = [[GPUImageGammaFilter alloc] init]; 

    } 
    else if (indexPath.row==25) 
    { 
     filter = [[GPUImageToneCurveFilter alloc] init]; 
     [(GPUImageToneCurveFilter *)filter setBlueControlPoints:[NSArray arrayWithObjects:[NSValue valueWithCGPoint:CGPointMake(0.0, 0.0)], [NSValue valueWithCGPoint:CGPointMake(0.5, 0.5)], [NSValue valueWithCGPoint:CGPointMake(1.0, 0.75)], nil]]; 
    } 
    else if (indexPath.row==26) 
    { 
     filter = [[GPUImageHighlightShadowFilter alloc] init]; 

    } 
    else if (indexPath.row==27) 
    { 
     filter = [[GPUImageHazeFilter alloc] init]; 

    } 
    else if (indexPath.row==28) 
    { 
     filter = [[GPUImageAverageColor alloc] init]; 

    } 
    else if (indexPath.row==29) 
    { 
     filter = [[GPUImageLuminosity alloc] init]; 

    } 
    else if (indexPath.row==30) 
    { 
     filter = [[GPUImageHistogramFilter alloc] initWithHistogramType:kGPUImageHistogramRGB]; 

    } 
    else if (indexPath.row==31) 
    { 
     filter = [[GPUImageLuminanceThresholdFilter alloc] init]; 

    } 
    else if (indexPath.row==32) 
    { 
     filter = [[GPUImageAdaptiveThresholdFilter alloc] init]; 

    } 
    else if (indexPath.row==33) 
    { 
     filter = [[GPUImageAverageLuminanceThresholdFilter alloc] init]; 

    } 
    else if (indexPath.row==34) 
    { 
     filter = [[GPUImageCropFilter alloc] initWithCropRegion:CGRectMake(0.0, 0.0, 1.0, 0.25)]; 
    } 


    [sourcePicture addTarget:filter]; 
    [filter addTarget:self.vwGPUImagview]; 
    [sourcePicture processImage]; 


} 

Выход: -

enter image description here

EDIT: - Когда я пишу [filter removeAllTarget] какой-либо фильтр не работал. и если я удалю его, то он сработает полностью. где моя ошибка?

EDIT 2: - Demo Link

+0

Вы не указали * где * все идет медленно. Они медленны, когда они впервые появляются в представлении коллекции? Они медленны, когда они выбраны? Насколько велики эти образы? Сохранены ли ваши эскизы в полном разрешении или только уменьшенное разрешение, необходимое для миниатюры? Кроме того, я отмечаю, что пока вы удаляете все цели из своего фильтра, вы, похоже, не удаляете все цели из вашего повторно используемого изображения. Это означает, что изображение будет загружаться в постоянно увеличивающийся список фильтров каждый раз, когда вы переходите на новый. –

+0

@BradLarson благодарит вас за повторное воспроизведение. Фактически, я временно применял фильтр к коллекциям «cellforitematindexpath». После завершения проекта я установлю его как статическое изображение. Основная проблема заключается в том, что изображение будет медленным, когда я вызываю действие в 'didselectrowatindexpath'. В вопросе я отредактировал ссылку github. Как я пытался добиться этого. –

ответ

5

на основе кода при условии, что вы делаете несколько вещей здесь, что будет очень медленно это вниз. Во-первых, у вас есть, по-видимому, бесполезная GPUImageVideoCamera, которую вы воссоздаете несколько раз. Это можно удалить.

Во-вторых, вы создаете новый GPUImagePicture на основе UIImage каждый раз, когда хотите отобразить ячейку. Это будет очень медленно. Вместо этого попробуйте использовать одно общее изображение и замените его, когда отображаются ячейки. Кроме того, ограничивайте размер вашего фильтра размером ваших эскизов в ячейках, используя -forceProcessingAtSize:. Нет смысла фильтровать гигантский образ, только для отображения миниатюры.

Наконец, как я отмечаю выше, каждый раз, когда вы меняете новый фильтр, вы удаляете выходы фильтра, но не изображения. Это означает, что каждый фильтр, который вы меняете, добавляется как результат для вашего изображения, но никогда не удаляется. Ваше изображение увеличит список выходных фильтров и будет медленнее и медленнее обрабатывать. Удалите все выходы с изображения одновременно с удалением всех выходов из предыдущего фильтра.

Вы также можете использовать -forceProcessingAtSize: на своих фильтрах, чтобы ограничить их только размером вашего полного экрана, который все еще может быть меньше исходного изображения.

+0

Большое спасибо за повторное извинение за поздний ответ. Я получаю небольшое изображение в gpuimageview. не могли бы вы помочь мне решить проблему? –

+0

Спасибо, моя проблема решена. Ты жжешь. –

Смежные вопросы