B&W + channel mixer + color filter = maximum brightness too low, whites turn gray issue2583
This commit is contained in:
parent
77177deb61
commit
c381db2f1f
@ -479,14 +479,13 @@ namespace rtengine {
|
|||||||
* @param setting BlackWhite::setting
|
* @param setting BlackWhite::setting
|
||||||
* @param setting BlackWhite::filter
|
* @param setting BlackWhite::filter
|
||||||
*/
|
*/
|
||||||
void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::ustring &filter, const Glib::ustring &algo, float &mixerRed, float &mixerGreen,
|
void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::ustring &filter, const Glib::ustring &algo, float &filcor, float &mixerRed, float &mixerGreen,
|
||||||
float &mixerBlue, float mixerOrange, float mixerYellow, float mixerCyan, float mixerPurple, float mixerMagenta,
|
float &mixerBlue, float mixerOrange, float mixerYellow, float mixerCyan, float mixerPurple, float mixerMagenta,
|
||||||
bool autoc, bool complement, float &kcorec, double &rrm, double &ggm, double &bbm)
|
bool autoc, bool complement, float &kcorec, double &rrm, double &ggm, double &bbm)
|
||||||
{
|
{
|
||||||
float somm;
|
float somm;
|
||||||
float som = mixerRed+mixerGreen+mixerBlue;
|
float som = mixerRed+mixerGreen+mixerBlue;
|
||||||
// rM = mixerRed, gM = mixerGreen, bM = mixerBlue !
|
// rM = mixerRed, gM = mixerGreen, bM = mixerBlue !
|
||||||
|
|
||||||
//presets
|
//presets
|
||||||
if (setting=="RGB-Abs" || setting=="ROYGCBPM-Abs")
|
if (setting=="RGB-Abs" || setting=="ROYGCBPM-Abs")
|
||||||
kcorec=som/100.f;
|
kcorec=som/100.f;
|
||||||
@ -609,25 +608,24 @@ namespace rtengine {
|
|||||||
kcorec = koymcp+som/100.f;
|
kcorec = koymcp+som/100.f;
|
||||||
//Color filters
|
//Color filters
|
||||||
float filred,filgreen,filblue;
|
float filred,filgreen,filblue;
|
||||||
filred=1.f;filgreen=1.f;filblue=1.f;
|
filred=1.f;filgreen=1.f;filblue=1.f;filcor=1.f;
|
||||||
if (filter=="None") {filred=1.f; filgreen=1.f; filblue=1.f;}
|
if (filter=="None") {filred=1.f; filgreen=1.f; filblue=1.f; filcor=1.f;}
|
||||||
else if (filter=="Red") {filred=1.f; filgreen=0.05f;filblue=0.f;}
|
else if (filter=="Red") {filred=1.f; filgreen=0.05f;filblue=0.f; filcor=1.08f;}
|
||||||
else if (filter=="Orange") {filred=1.f; filgreen=0.6f; filblue=0.f;}
|
else if (filter=="Orange") {filred=1.f; filgreen=0.6f; filblue=0.f; filcor=1.35f;}
|
||||||
else if (filter=="Yellow") {filred=1.f; filgreen=1.f; filblue=0.05f;}
|
else if (filter=="Yellow") {filred=1.f; filgreen=1.f; filblue=0.05f;filcor=1.23f;}
|
||||||
else if (filter=="YellowGreen") {filred=0.6f; filgreen=1.f; filblue=0.3f;}
|
else if (filter=="YellowGreen") {filred=0.6f; filgreen=1.f; filblue=0.3f;filcor=1.32f;}
|
||||||
else if (filter=="Green") {filred=0.2f; filgreen=1.f; filblue=0.3f;}
|
else if (filter=="Green") {filred=0.2f; filgreen=1.f; filblue=0.3f;filcor=1.41f;}
|
||||||
else if (filter=="Cyan") {filred=0.05f;filgreen=1.f; filblue=1.f;}
|
else if (filter=="Cyan") {filred=0.05f;filgreen=1.f; filblue=1.f; filcor=1.23f;}
|
||||||
else if (filter=="Blue") {filred=0.f; filgreen=0.05f;filblue=1.f;}
|
else if (filter=="Blue") {filred=0.f; filgreen=0.05f;filblue=1.f; filcor=1.20f;}
|
||||||
else if (filter=="Purple") {filred=1.f; filgreen=0.05f;filblue=1.f;}
|
else if (filter=="Purple") {filred=1.f; filgreen=0.05f;filblue=1.f; filcor=1.23f;}
|
||||||
|
mixerRed = mixerRed * filred;
|
||||||
|
|
||||||
mixerRed = mixerRed * filred;
|
|
||||||
mixerGreen = mixerGreen * filgreen;
|
mixerGreen = mixerGreen * filgreen;
|
||||||
mixerBlue = mixerBlue * filblue;
|
mixerBlue = mixerBlue * filblue;
|
||||||
|
|
||||||
mixerRed = mixerRed / (mixerRed + mixerGreen + mixerBlue);
|
mixerRed = filcor*mixerRed / (mixerRed + mixerGreen + mixerBlue);
|
||||||
mixerGreen = mixerGreen / (mixerRed + mixerGreen + mixerBlue);
|
mixerGreen = filcor*mixerGreen / (mixerRed + mixerGreen + mixerBlue);
|
||||||
mixerBlue = mixerBlue / (mixerRed + mixerGreen + mixerBlue);
|
mixerBlue = filcor*mixerBlue / (mixerRed + mixerGreen + mixerBlue);
|
||||||
|
|
||||||
if(filter!="None") {
|
if(filter!="None") {
|
||||||
som = mixerRed+mixerGreen+mixerBlue;
|
som = mixerRed+mixerGreen+mixerBlue;
|
||||||
if(setting=="RGB-Abs" || setting=="ROYGCBPM-Abs") kcorec = kcorec*som;
|
if(setting=="RGB-Abs" || setting=="ROYGCBPM-Abs") kcorec = kcorec*som;
|
||||||
|
@ -734,7 +734,7 @@ public:
|
|||||||
* @param ggm green channel of the mixer (return value)
|
* @param ggm green channel of the mixer (return value)
|
||||||
* @param bbm blue channel of the mixer (return value)
|
* @param bbm blue channel of the mixer (return value)
|
||||||
*/
|
*/
|
||||||
static void computeBWMixerConstants (const Glib::ustring &setting, const Glib::ustring &filter, const Glib::ustring &algo, float &mixerRed, float &mixerGreen,
|
static void computeBWMixerConstants (const Glib::ustring &setting, const Glib::ustring &filter, const Glib::ustring &algo, float &filcor, float &mixerRed, float &mixerGreen,
|
||||||
float &mixerBlue, float mixerOrange, float mixerYellow, float mixerCyan, float mixerPurple, float mixerMagenta,
|
float &mixerBlue, float mixerOrange, float mixerYellow, float mixerCyan, float mixerPurple, float mixerMagenta,
|
||||||
bool autoc, bool complement, float &kcorec, double &rrm, double &ggm, double &bbm);
|
bool autoc, bool complement, float &kcorec, double &rrm, double &ggm, double &bbm);
|
||||||
|
|
||||||
|
@ -3422,8 +3422,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, EditBuffer *e
|
|||||||
mixerPurple = 33.f;
|
mixerPurple = 33.f;
|
||||||
mixerCyan = 33.f;
|
mixerCyan = 33.f;
|
||||||
}
|
}
|
||||||
|
float filcor;
|
||||||
Color::computeBWMixerConstants(params->blackwhite.setting, params->blackwhite.filter,params->blackwhite.algo,
|
Color::computeBWMixerConstants(params->blackwhite.setting, params->blackwhite.filter,params->blackwhite.algo,filcor,
|
||||||
bwr, bwg, bwb, mixerOrange, mixerYellow, mixerCyan, mixerPurple, mixerMagenta,
|
bwr, bwg, bwb, mixerOrange, mixerYellow, mixerCyan, mixerPurple, mixerMagenta,
|
||||||
params->blackwhite.autoc, complem, kcorec, rrm, ggm, bbm);
|
params->blackwhite.autoc, complem, kcorec, rrm, ggm, bbm);
|
||||||
|
|
||||||
|
@ -1088,10 +1088,16 @@ void BlackWhite::updateRGBLabel () {
|
|||||||
b = mixerBlue->getValue();
|
b = mixerBlue->getValue();
|
||||||
}
|
}
|
||||||
double mixR, mixG, mixB;
|
double mixR, mixG, mixB;
|
||||||
|
float filcor;
|
||||||
Glib::ustring sSetting = getSettingString();
|
Glib::ustring sSetting = getSettingString();
|
||||||
Color::computeBWMixerConstants(sSetting, getFilterString(),getalgoString(), r, g, b,
|
Color::computeBWMixerConstants(sSetting, getFilterString(),getalgoString(), filcor, r, g, b,
|
||||||
mixerOrange->getValue(), mixerYellow->getValue(), mixerCyan->getValue(), mixerPurple->getValue(), mixerMagenta->getValue(),
|
mixerOrange->getValue(), mixerYellow->getValue(), mixerCyan->getValue(), mixerPurple->getValue(), mixerMagenta->getValue(),
|
||||||
autoch->get_active(), enabledcc->get_active(), kcorrec, mixR, mixG, mixB);
|
autoch->get_active(), enabledcc->get_active(), kcorrec, mixR, mixG, mixB);
|
||||||
|
if( filcor!=1.f){
|
||||||
|
r=kcorrec*r/(r+g+b);
|
||||||
|
g=kcorrec*g/(r+g+b);
|
||||||
|
b=kcorrec*b/(r+g+b);
|
||||||
|
}
|
||||||
RGBLabels->set_text(
|
RGBLabels->set_text(
|
||||||
Glib::ustring::compose(M("TP_BWMIX_RGBLABEL"),
|
Glib::ustring::compose(M("TP_BWMIX_RGBLABEL"),
|
||||||
Glib::ustring::format(std::fixed, std::setprecision(1), r*100.),
|
Glib::ustring::format(std::fixed, std::setprecision(1), r*100.),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user