【问题标题】:How to Implement GPUImageMaskFilter using GPUImage如何使用 GPUImage 实现 GPUImageMaskFilter
【发布时间】:2014-05-12 13:56:47
【问题描述】:

我需要使用蒙版从完整图像中剪切并创建蒙版图像。

+=

我尝试了以下方法:

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

但是,我生成的输出图像是:

请大家携手共进。 干杯。

另外,感谢BradLarson

【问题讨论】:

  • 好问题。我有类似的任务,现在尝试用两张图片来解决它 - 一张用于蒙版,一张用于绑定。
  • 这是一个非常令人震惊的输出图像。
  • 第一步,尝试像这样交换纹理索引:[FullGpuImage addTarget:maskingFilter atIndex:0]; [maskGpuImage addTarget:maskingFilter atIndex:1]; 看看这是否能让你更接近你想要的输出。

标签: ios objective-c uiimage gpuimage


【解决方案1】:

蒙版是第二个目标,可以在滤镜着色器代码 (textureColor2) 中看到。

//Averages mask's the RGB values, and scales that value by the mask's alpha
//
//The dot product should take fewer cycles than doing an average normally
//
//Typical/ideal case, R,G, and B will be the same, and Alpha will be 1.0

 lowp float newAlpha = dot(textureColor2.rgb, vec3(.33333334, .33333334, .33333334)) * textureColor2.a;

 gl_FragColor = vec4(textureColor.xyz, newAlpha);

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

所以你的代码应该是

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

[maskingFilter useNextFrameForImageCapture];

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

还有你的面具(好​​吧,我做了一个丑陋的快速测试,使用正确的图像)像

为了预期的结果。

【讨论】:

    【解决方案2】:

    您不需要蒙版过滤器,而是需要 Alpha 蒙版混合。

    我这样实现了一个here

    // 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 通道。

    然后createGPUImageTwoInputFilter

    GPUImageTwoInputFilter * alphaMask = [[GPUImageTwoInputFilter alloc] initWithFragmentShaderFromString:kNBUAlphaMaskShaderString];
    

    我不确定从那以后是否有类似的混合过滤器被添加到 GPUImage 中。


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

    【讨论】:

    • 谢谢。另外,让我也试试这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2014-09-23
    • 2014-07-29
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多