我正在尝试创建图像的反转,作为应用程序的一部分。我已经使用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 通道。