iOS openGL 图像反转



我正在尝试创建图像的反转,作为应用程序的一部分。我已经使用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);这只是在图像和黑屏之间切换。

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

这个着色器怎么样:

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);"
};

如果你可以使用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)。

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

最新更新