2017-02-24 3 views
1

Ich habe einen Bleistiftskizze-Filter mit dem GPUImage-Framework implementiert. Aber ich denke, der Filter ist zu komplex, um die Ausgabe zu erzeugen.GPUImage Bleistiftskizze Filteroptimierung

Bleistift Filterfunktion

- (void)pencilSketch 
{ 
    //UIImage *inputImage = [UIImage imageNamed:@"portrait.jpg"]; 
    UIImage *inputImage = [UIImage imageNamed:@"selfie4.jpg"]; 


    GPUImageGrayscaleFilter *grayFilter = [[GPUImageGrayscaleFilter alloc] init]; 
    GPUImageColorInvertFilter *edgeFilter = [[GPUImageColorInvertFilter alloc] init]; 
    GPUImageGaussianBlurFilter *blurr = [[GPUImageGaussianBlurFilter alloc] init]; 
    blurr.blurRadiusInPixels = 8.0;   // Edge Sensitivity 
    blurr.texelSpacingMultiplier = 8.0;  // Edge Strength 

    GPUImageLinearBurnBlendFilter *filter = [[GPUImageLinearBurnBlendFilter alloc] init]; 

    UIImage *invImg = [edgeFilter imageByFilteringImage: inputImage];  // Color Invert 
    UIImage *blurrImg = [blurr imageByFilteringImage: inputImage];   // Gaussian Blurr 

    // Linear Burn Blend 
    GPUImagePicture *mainPicture = [[GPUImagePicture alloc] initWithImage: invImg]; 
    GPUImagePicture *topPicture = [[GPUImagePicture alloc] initWithImage: blurrImg]; 

    [mainPicture addTarget: filter]; 
    [topPicture addTarget: filter]; 

    [filter useNextFrameForImageCapture]; 
    [mainPicture processImage]; 
    [topPicture processImage]; 

    UIImage *resultedimage = [filter imageFromCurrentFramebuffer]; 
    resultedimage = [UIImage imageWithCGImage:[resultedimage CGImage] scale:1.0 orientation: invImg.imageOrientation]; 

    GPUImageColorInvertFilter *bf = [[GPUImageColorInvertFilter alloc] init]; 
    resultedimage = [bf imageByFilteringImage: resultedimage];  // Color Invert 
    resultedimage = [grayFilter imageByFilteringImage: resultedimage]; // Gray scale 

    UIImage *grainImage = [UIImage imageNamed:@"stroke2.jpg"]; 
    GPUImageGaussianBlurFilter *gBlurr = [[GPUImageGaussianBlurFilter alloc] init]; 
    gBlurr.blurRadiusInPixels = 5.0; 
    UIImage *blurrGrainImg = [gBlurr imageByFilteringImage: grainImage]; 
    GPUImagePicture *blurrPic = [[GPUImagePicture alloc] initWithImage: resultedimage]; 
    GPUImagePicture *topPic = [[GPUImagePicture alloc] initWithImage: blurrGrainImg]; 

    GPUImageSoftLightBlendFilter *maskedFilter = [[GPUImageSoftLightBlendFilter alloc] init]; 
    [blurrPic addTarget: maskedFilter]; 
    [topPic addTarget: maskedFilter]; 
    [maskedFilter useNextFrameForImageCapture]; 
    [blurrPic processImage]; 
    [topPic processImage]; 

    resultedimage = [maskedFilter imageFromCurrentFramebuffer]; 
    resultedimage = [UIImage imageWithCGImage:[resultedimage CGImage] scale:1.0 orientation: inputImage.imageOrientation]; 

    GPUImageColorBurnFilter *bFilter = [[GPUImageColorBurnFilter alloc] init]; 
    bFilter.brightness = 5.0;   // Edge Darkness 
    resultedimage = [bFilter imageByFilteringImage: resultedimage]; 

    baseImage.image = resultedimage; 
} 

Ausgabe für so Ergebnis des Filters

enter image description here

Bitte mir jemand vorschlagen, wie diese Filter zu optimieren? Ich möchte, wenn mich jemand dazu bringt, ein Shader-Programm dafür zu schreiben. Ich kann ein benutzerdefiniertes GPUImageFilter machen und Shader-Programm für dasselbe schreiben.

Antwort

2
UIImage *imgCropped=image; 
stillImageSource = [[GPUImagePicture alloc] initWithImage:imgCropped]; 
saturationFilter=[[GPUImageSaturationFilter alloc]init]; 
[saturationFilter setSaturation:0]; 
[stillImageSource addTarget:saturationFilter]; 
[stillImageSource processImage]; 
[saturationFilter useNextFrameForImageCapture]; 
UIImage *copyImage=[saturationFilter imageFromCurrentFramebuffer]; 
stillImageSource=[[GPUImagePicture alloc] initWithImage:copyImage]; 
copyGPUimage=[[GPUImagePicture alloc] initWithImage:copyImage]; 

invertFilter=[[GPUImageColorInvertFilter alloc]init]; 
    [ copyGPUimage addTarget:invertFilter]; 
[ copyGPUimage processImage]; 
[invertFilter useNextFrameForImageCapture]; 
UIImage *imgTempr=[invertFilter imageFromCurrentFramebuffer]; 
copyGPUimage= [[GPUImagePicture alloc]initWithImage:imgTempr]; 


gaussianBlur=[[GPUImageGaussianBlurFilter alloc]init]; 
[gaussianBlur setBlurRadiusInPixels:val]; 
[copyGPUimage addTarget:gaussianBlur]; 
[ copyGPUimage processImage]; 
[gaussianBlur useNextFrameForImageCapture]; 

UIImage *imgTempa=[gaussianBlur imageFromCurrentFramebuffer]; 
    copyGPUimage= [[GPUImagePicture alloc]initWithImage:imgTempa]; 

colorDodge = [[GPUImageColorDodgeBlendFilter alloc] init];

[stillImageSource addTarget:colorDodge]; 
[ copyGPUimage addTarget:colorDodge]; 
[stillImageSource processImage]; 
[ copyGPUimage processImage]; 
[colorDodge useNextFrameForImageCapture]; 
imageWithAppliedThreshold=[colorDodge imageFromCurrentFramebuffer]; 

// hier haben Sie Ihre Skizze bekam jetzt können Sie die Dunkelheit gesetzt

stillImageSource = [[GPUImagePicture alloc] initWithImage:imageWithAppliedThreshold]; 
monochromeFilter=[[GPUImageMonochromeFilter alloc]init]; 
[monochromeFilter setIntensity:intenVal]; 
[monochromeFilter setColorRed:0.0 green:0.0 blue:0.0]; 
[monochromeFilter setBackgroundColorRed:1.0 green:1.0 blue:1.0 alpha:1.0]; 
[stillImageSource addTarget: monochromeFilter]; 
[stillImageSource processImage]; 
[monochromeFilter useNextFrameForImageCapture]; 
imageWithAppliedThreshold=[monochromeFilter imageFromCurrentFramebuffer]; 
Verwandte Themen