android - 黑白模式的负图像过滤器
问题描述
我正在使用https://github.com/natario1/CameraView这个库来捕获负图像到正图像,它使用的是 openGl 着色器。我需要一个滤镜,我可以在黑白模式下而不是在正常颜色模式下(目前在库中可用)将负图像捕获为正图像。我试图混合这两个滤镜,即首先在彩色模式下将负图像捕获为正图像,然后应用黑白模式滤镜,但由于我是 openGl 的新手,所以我无法做到这一点。请在这方面帮助我。将不胜感激。我使用的着色器如下:
This shader is used to convert the negative to positive in color mode.
private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n"
+ "precision mediump float;\n"
+ "varying vec2 "+DEFAULT_FRAGMENT_TEXTURE_COORDINATE_NAME+";\n"
+ "uniform samplerExternalOES sTexture;\n"
+ "void main() {\n"
+ " vec4 color = texture2D(sTexture, "+DEFAULT_FRAGMENT_TEXTURE_COORDINATE_NAME+");\n"
+ " float colorR = (1.0 - color.r) / 1.0;\n"
+ " float colorG = (1.0 - color.g) / 1.0;\n"
+ " float colorB = (1.0 - color.b) / 1.0;\n"
+ " gl_FragColor = vec4(colorR, colorG, colorB, color.a);\n"
+ "}\n";
This shader is used to change the normal positive image in Black & White mode.
private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n"
+ "precision mediump float;\n"
+ "varying vec2 "+DEFAULT_FRAGMENT_TEXTURE_COORDINATE_NAME+";\n"
+ "uniform samplerExternalOES sTexture;\n" + "void main() {\n"
+ " vec4 color = texture2D(sTexture, "+DEFAULT_FRAGMENT_TEXTURE_COORDINATE_NAME+");\n"
+ " float colorR = (color.r + color.g + color.b) / 3.0;\n"
+ " float colorG = (color.r + color.g + color.b) / 3.0;\n"
+ " float colorB = (color.r + color.g + color.b) / 3.0;\n"
+ " gl_FragColor = vec4(colorR, colorG, colorB, color.a);\n"
+ "}\n";
Please help in making a filter which can direct capture the negative image to positive in Black & White mode.
Thanks.
解决方案
您可以在单个着色器中使用单线来做到这一点:
gl_FragColor = vec4(vec3(dot(1.0 - color.rgb, vec3(1.0/3.0))), color.a);
解释:
反色是:
vec3 inverseColor = 1.0 - color.rgb;
对于灰度有 2 个机会。要么直截了当
float gray = (inverseColor.r + inverseColor.g + inverseColor.b) / 3.0;
或通过使用dot
产品:
float gray = dot(1.0 - inverseColor.rgb, vec3(1.0/3.0));
最后构造一个vec3
from gray
:
gl_FragColor = vec4(vec3(gray), color.a);
推荐阅读
- python - 如何使用numpy将0添加到列表列表的末尾?
- android - 更新表 2 的某些行时更新表 1 的 Sqlite 触发器
- python - Flask-SQLAlchemy - 检索 Query.all() - 每行中的所有列
- excel - 如何避免“下标超出范围?
- c# - 如何从任何 Cpu 项目中使用特定的本机 dll nuget
- c# - 在 Docker 中使用 System.Drawing
- bash - 为所有源文件添加自动标题注释
- python-3.x - 大文件中的字谜
- go - 如何从 go 中的另一个包访问结构变量?
- reference - 传递给带有可变参数的模板时如何保持参数引用?