【问题标题】:iOS openGL image invertiOS openGL 图像反转
【发布时间】:2022-01-08 01:25:42
【问题描述】:

我正在尝试创建图像的反转,作为应用程序的一部分。 在 Apple 的 GLImageProcessing 演示之后,我使用 openGL 实现了一些图像处理。

我的图像是从 .jpg 加载的,并加载到纹理中。我可以愉快地修改对比度和亮度。

但是,我在尝试创建反向图像(将黑色换成白色)时的结果并不令人满意。 我尝试了几种方法,但在设备上没有任何效果。 到目前为止,我已经尝试过; glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); 这在模拟器中运行良好,但在设备上会产生不稳定的结果。 我也试过; glBlendFunc(GL_ONE_MINUS_SRC_COLOR, GL_ONE_MINUS_DST_COLOR); 这会像以前一样产生结果。 最后,我试过了; glLogicOp(GL_XOR); 这只是在图像和黑屏之间切换。

您能否建议一个(相对)简单的解决方案来反转我的图像?

【问题讨论】:

  • 是灰度图吗?为此编写一个着色器怎么样?
  • 图像是灰度的,是的。

标签: ios image opengl-es


【解决方案1】:

这个着色器怎么样:

void main() {
    vec4 color = texture2D(texture, textureCoordinate);
    float inverted = 1.0 - color.r; 
    vec4 inverted_vec = vec4( vec3(inverted), 1.0);
    gl_FragColor = clamp(inverted_vec, 0.0, 1.0);"
};

【讨论】:

    【解决方案2】:

    如果您可以使用 OpenGL ES 2.0(您应该可以安全地使用,因为在野外只有一小部分只有 1.1 的设备),一个简单的方法是使用我的开源 GPUImage框架及其 GPUImageColorInvertFilter。

    以下代码从磁盘加载您的图像,创建一个颜色反转过滤器,应用该过滤器,然后输出一个 UIImage 供您使用:

    UIImage *inputImage = [UIImage imageNamed:@"image.jpg"];
    GPUImageColorInvertFilter *stillImageFilter = [[GPUImageColorInvertFilter alloc] init];
    UIImage *quickFilteredImage = [stillImageFilter imageByFilteringImage:inputImage];
    

    如果您只想将生成的图像显示到屏幕上,或者将其用作纹理,则可以将过滤器定向到 GPUImageView 或 GPUImageTextureOutput 以避免一些核心图形开销(由于生成输出 UIImage) .

    【讨论】:

      【解决方案3】:

      如果你没有透明度,我建议你先在图像应该出现的地方画一个白色矩形(没有纹理,只有纯白色)。然后使用glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR)并禁用alpha通道glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE)并绘制灰度纹理。如果您不需要透明度,这应该会给您想要的效果,在其他情况下,您应该使用带有纹理的 FBO 来做同样的事情。同样在绘制纹理后重新启用 Alpha 通道。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-09
        • 2020-11-29
        • 1970-01-01
        • 1970-01-01
        • 2013-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多