我正在尝试创建图像的反转,作为应用程序的一部分。 我已经使用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);
这只是在图像和黑屏之间切换。
你能建议一个(相对)简单的解决方案来反转我的形象吗?
答案 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通道。