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];