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
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.