如何用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)你正在过滤text1text2 GPUImagePictures,但忘了处理它们:

 // Processing [origin processImage]; [text1 processImage]; [text2 processImage]; 

3) UIImage *output = [blendFilter2 imageFromCurrentlyProcessedOutput];

你应该调用imageFromCurrentlyProcessedOutput链上的最后一个filter,你的情况是groupfilter。 我不需要在这里使用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