Отрицательный фильтр изображения в черно-белом режиме - PullRequest
2 голосов
/ 07 апреля 2020

Я использую 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.

1 Ответ

2 голосов
/ 07 апреля 2020

Вы можете сделать это с помощью одной строки в одном шейдере:

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 из gray:

gl_FragColor = vec4(vec3(gray), color.a);
...