Ios 如何使用GPUImage实现GPUImageMaskFilter

Ios 如何使用GPUImage实现GPUImageMaskFilter,ios,objective-c,uiimage,gpuimage,Ios,Objective C,Uiimage,Gpuimage,我需要使用遮罩从完整图像中剪切并创建遮罩图像 += 我尝试了以下方法: UIImage *imgMask = [UIImage imageNamed:@"Mask.png"]; UIImage *imgBgImage = [UIImage imageNamed:@"Full.png"]; GPUImageMaskFilter *maskingFilter = [[GPUImageMaskFilter alloc] init]; GPUImagePicture * maskGpuImag

我需要使用遮罩从完整图像中剪切并创建遮罩图像

+=

我尝试了以下方法:

UIImage *imgMask = [UIImage imageNamed:@"Mask.png"];
UIImage *imgBgImage = [UIImage imageNamed:@"Full.png"];



GPUImageMaskFilter *maskingFilter = [[GPUImageMaskFilter alloc] init];


GPUImagePicture * maskGpuImage = [[GPUImagePicture alloc] initWithImage:imgMask ];

GPUImagePicture *FullGpuImage = [[GPUImagePicture alloc] initWithImage:imgBgImage ];




[maskGpuImage addTarget:maskingFilter];
[maskGpuImage processImage];


[maskingFilter useNextFrameForImageCapture];


[FullGpuImage addTarget:maskingFilter];
[FullGpuImage processImage];



UIImage *OutputImage = [maskingFilter imageFromCurrentFramebuffer];
但是,我生成的输出图像是:

请大家携起手来。 干杯


另外,多亏了。

您不需要遮罩过滤器,只需要alpha遮罩混合

我实现了这样一个:

// GPUImage shader strings
NSString * const kNBUAlphaMaskShaderString = SHADER_STRING
(
 varying highp vec2 textureCoordinate;
 varying highp vec2 textureCoordinate2;

 uniform sampler2D inputImageTexture;
 uniform sampler2D inputImageTexture2;

 void main()
 {
     lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
     lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2);

     gl_FragColor = vec4(textureColor.xyz, textureColor2.a);
 }
 );
只需保留一幅图像的颜色和第二幅图像的alpha通道

然后是一个
GPUImageTwoInputFilter

GPUImageTwoInputFilter * alphaMask = [[GPUImageTwoInputFilter alloc] initWithFragmentShaderFromString:kNBUAlphaMaskShaderString];
我不确定是否有类似的混合过滤器已添加到GPUImage自



只是再次检查,看看是否有一个内置的混合,这样做,没有。但我用作灵感的混合过滤器仍然存在()。它使用alpha遮罩合并两个图像以混合它们。上面提到的过滤器不需要第二个“空”图像。

如过滤器着色器代码(textureColor2)所示,遮罩是第二个目标

然后,您需要“反转”您的遮罩:黑色背景上的白心,因为过滤器使用RGB像素值的“权重”来设置目标图像上的alpha值

所以你的代码应该是

// Image first, Mask next
[FullGpuImage addTarget:maskingFilter];
[FullGpuImage processImage];

[maskingFilter useNextFrameForImageCapture];

[maskGpuImage addTarget:maskingFilter];
[maskGpuImage processImage];    
你的面具(好的,我做了一个丑陋的快速测试,使用正确的图像)像

为了达到预期的效果


问得好。我有类似的任务,现在正试图用两个图像来解决它——一个用于遮罩,另一个用于绑定。这是一个非常令人震惊的输出图像。作为第一步,尝试像这样交换纹理索引:
[FullGpuImage addTarget:maskingFilter atIndex:0]
[maskGpuImage addTarget:maskingFilter atIndex:1]查看这是否使您更接近所需的output.Thx。还有,让我也试试这个。
// Image first, Mask next
[FullGpuImage addTarget:maskingFilter];
[FullGpuImage processImage];

[maskingFilter useNextFrameForImageCapture];

[maskGpuImage addTarget:maskingFilter];
[maskGpuImage processImage];