From 5cc8fdd83d90dca3f7c7cb5c7fdef4c3ea018aed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Tue, 20 Dec 2022 22:27:15 +0100 Subject: [PATCH] Simple grey world white balance --- imagescrollareagl.cpp | 15 +++++++++++++++ imagescrollareagl.h | 1 + shaders/image.frag | 3 +++ 3 files changed, 19 insertions(+) diff --git a/imagescrollareagl.cpp b/imagescrollareagl.cpp index af77ed4..baaeb76 100644 --- a/imagescrollareagl.cpp +++ b/imagescrollareagl.cpp @@ -353,6 +353,8 @@ void ImageWidget::paintGL() m_program->setUniformValue("zoom", 1.0f/m_scale); m_program->setUniformValue("bw", m_bwImg && !m_superpixel); m_program->setUniformValue("invert", m_invert); + if(m_superpixel)m_program->setUniformValue("whiteBalance", m_whiteBalance[0], m_whiteBalance[1], m_whiteBalance[2]); + else m_program->setUniformValue("whiteBalance", 1.0f, 1.0f, 1.0f); #ifdef COLOR_MANAGMENT m_program->setUniformValue("srgb", m_srgb); #endif @@ -642,6 +644,19 @@ void ImageWidget::debayer() f->glGenerateMipmap(GL_TEXTURE_2D); f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + + int size = std::max(m_imgWidth, m_imgHeight); + int level = 0; + while(size >>= 1)level++; + int w,h; + f3->glGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_WIDTH, &w); + f3->glGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_HEIGHT, &h); + uint16_t pixel[w*h*4]; + f3->glGetTexImage(GL_TEXTURE_2D, level, GL_RGBA, GL_UNSIGNED_SHORT, pixel); + float maxRGB = std::max(std::max(pixel[0], pixel[1]), pixel[2]); + m_whiteBalance[0] = maxRGB / pixel[0]; + m_whiteBalance[1] = maxRGB / pixel[1]; + m_whiteBalance[2] = maxRGB / pixel[2]; } ImageScrollAreaGL::ImageScrollAreaGL(Database *database, QWidget *parent) : QWidget(parent) diff --git a/imagescrollareagl.h b/imagescrollareagl.h index 3b3ab21..a052e48 100644 --- a/imagescrollareagl.h +++ b/imagescrollareagl.h @@ -52,6 +52,7 @@ class ImageWidget : public QOpenGLWidget float m_range; float m_dx, m_dy; float m_scale; + float m_whiteBalance[3]; bool m_blockRepaint; bool m_bwImg; bool m_invert; diff --git a/shaders/image.frag b/shaders/image.frag index a86af41..0dc9d81 100644 --- a/shaders/image.frag +++ b/shaders/image.frag @@ -5,6 +5,7 @@ uniform vec3 mtf_param; uniform bool bw; uniform bool invert; uniform bool srgb; +uniform vec3 whiteBalance; in vec2 qt_TexCoord0; out vec4 color; @@ -40,6 +41,8 @@ void main(void) if(srgb)color.rgb = Linear2sRGB(color.rgb); + color.rgb *= whiteBalance; + if(any(lessThan(qt_TexCoord0, vec2(0.0))) || any(greaterThan(qt_TexCoord0, vec2(1.0)))) color = vec4(0.0, 0.0, 0.0, 1.0);