3

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

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

4

3 回答 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);"
};
于 2012-12-15T19:09:51.070 回答
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 以避免一些核心图形开销(由于输出 UIImage 的生成)。

于 2012-12-17T15:48:27.890 回答
0

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

于 2012-12-17T11:53:57.657 回答