如何用GPUImage框架实现那些过滤链接?
我试图链接混合图层并过滤它
(原始 – > Texture1(不透明度30%)/ HardLight – > Texture2 / SoftLight)=>等级(45,0.95,238)+饱和度(-100)+色调(+42)
这是我试过的:
编辑:这段代码在下面,谢谢你的回答
// Textures GPUImagePicture *origin = [[GPUImagePicture alloc] initWithImage:originImage smoothlyScaleOutput:NO]; GPUImagePicture *text1 = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"filter_landscape_vintage_1.png"] smoothlyScaleOutput:NO]; GPUImagePicture *text2 = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"filter_landscape_vintage_2.png"] smoothlyScaleOutput:NO]; // Blend filters GPUImageHardLightBlendFilter *blendFilter1 = [[GPUImageHardLightBlendFilter alloc] init]; GPUImageSoftLightBlendFilter *blendFilter2 = [[GPUImageSoftLightBlendFilter alloc] init]; // Color filters GPUImageOpacityFilter *filter1 = [[GPUImageOpacityFilter alloc] init]; [filter1 setOpacity:0.3]; GPUImageLevelsFilter *filter2 = [[GPUImageLevelsFilter alloc] init]; [filter2 setMin:45.0/255.0 gamma:0.95 max:238.0/255.0]; // 45, 0.95, 238 GPUImageSaturationFilter *filter3 = [[GPUImageSaturationFilter alloc] init]; [filter3 setSaturation:0.0]; GPUImageHueFilter *filter4 = [[GPUImageHueFilter alloc] init]; [filter4 setHue:42.0]; // Texture1(opacity 30%)/HardLight [text1 addTarget:filter1]; // Opacity [filter1 addTarget:blendFilter1]; // HardLight Blend // Texture2/SoftLight [text2 addTarget:blendFilter2]; // SoftLight Blend // Chain Origin + Texture1 + Texture2 [origin addTarget:blendFilter1]; [blendFilter1 addTarget:blendFilter2]; // Result => level + saturation + hue [blendFilter2 addTarget:filter2]; [filter2 addTarget:filter3]; [filter3 addTarget:filter4]; // Processing [origin processImage]; [text1 processImage]; [text2 processImage]; UIImage *output = [filter4 imageFromCurrentlyProcessedOutput];
我看到一些问题:
1)可能有一个拼写错误的text1的filter:
[text1 addTarget:filter1]; // Opacity [text1 addTarget:blendFilter1]; // HardLight Blend
应该是
[text1 addTarget:filter1]; // Opacity [filter1 addTarget:blendFilter1]; // HardLight Blend
2)你正在过滤text1
和text2
GPUImagePictures,但忘了处理它们:
// Processing [origin processImage]; [text1 processImage]; [text2 processImage];
3) UIImage *output = [blendFilter2 imageFromCurrentlyProcessedOutput];
你应该调用imageFromCurrentlyProcessedOutput
链上的最后一个filter,你的情况是group
filter。 我不需要在这里使用GPUImageFilterGroup
,它通常用于创build使用现有filter的filter子类,但是我只是简单地将最后3个filter链接到blendFilter2
如下所示:
... // Result => level + saturation + hue [blendFilter2 addTarget:filter2]; [filter2 addTarget:filter3]; [filter3 addTarget:filter4]; // Processing [origin processImage]; [text1 processImage]; [text2 processImage]; UIImage *output = [filter4 imageFromCurrentlyProcessedOutput];
完整的链将是:
[text1] -> [filter1] \ +-> [blend1] \ [origin] / +-> [blend2] -> [filter2] -> [filter3] -> [filter4] [text2] /
编辑:
注意这些整数除法设置最小值和最大值:
[filter2 setMin:45/255 gamma:0.95 max:238/255]; // 45, 0.95, 238
最小和最大是0!
[filter2 setMin:45 / 255.0 gamma:0.95 max:238 / 255.0]; // 45, 0.95, 238