iOS openGL图像反转

时间:2012-12-14 20:00:55

标签: ios image opengl-es invert

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

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

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

你能建议一个(相对)简单的解决方案来反转我的形象吗?

3 个答案:

答案 0 :(得分: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);"
};

答案 1 :(得分:1)

如果你可以使用OpenGL ES 2.0(你应该可以安全地做到这一点,只考虑到野外只有1.1的设备),一个简单的方法就是使用我的开源{{3框架及其GPUImageColorInvertFilter。

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

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

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

答案 2 :(得分:0)

如果你没有透明度,我建议你首先绘制一个白色矩形,图像应该是(没有纹理,只有纯白色)。然后使用glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR)并禁用Alpha通道glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE)并绘制灰度纹理。如果您不需要透明度,这应该可以提供所需的效果,在其他情况下,您应该使用附加了纹理的FBO执行相同操作。在绘制纹理后,再次启用alpha通道。