iOS的OpenGL图像反转

3

我正在尝试创建一个图像的反转,作为应用程序的一部分。我使用了OpenGL实现了一些图像处理,遵循了苹果公司的GLImageProcessing演示。

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

然而,当我尝试创建一个反转图像(将黑色换成白色)时,结果不尽如人意。我已经尝试了一些方法,但在设备上没有取得良好的效果。

到目前为止,我已经尝试过以下方法:

  • glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); 这在模拟器中效果很好,但在设备上产生不稳定的结果。
  • glBlendFunc(GL_ONE_MINUS_SRC_COLOR, GL_ONE_MINUS_DST_COLOR); 这样做的效果与之前相同。
  • glLogicOp(GL_XOR); 这只是在图像和黑屏之间切换。

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


它是一张灰度图像吗?为此编写一个着色器怎么样? - Or Arbel
图像是灰度的,是的。 - Deaglan O Meachair
3个回答

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
如果您可以使用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,以避免一些Core Graphics开销(由于生成输出UIImage)。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接