Läbipaistvuse kompenseerimine

Kristjan Kannike, loodud 2022-07-19, muudetud 2022-07-21

Teeme värvi tumedamaks, et see paistaks läbipaistvana samasugune nagu algne värv:

compensateTransparency[col_?ColorQ,as_?NumericQ]:=With[{colspace=Head[col],rgbcol=ColorConvert[col,RGBColor]},
If[(Min@@rgbcol)<1-as,Print[StringForm["Warning: the original color is too dark to be compensated for opacity ``",as]]];
ColorConvert[(-1+as+#)/as&/@rgbcol,
colspace]];

lightred=;
lightblue=;

Nurgast kattuvad läbipaistmatud ruudud:

Graphics[{lightred,Rectangle[{0,0}],lightblue,Rectangle[{1/3,1/3}]}]

Nurgast kattuvad ruudud, mille värv on läbipaistvuse tõttu heledam:

Graphics[{Opacity[0.5],lightred,Rectangle[{0,0}],Opacity[0.5],lightblue,Rectangle[{1/3,1/3}]}]

Värvid ja nende tumedamad variandid:

lightred
compensateTransparency[lightred,0.5]

lightblue
compensateTransparency[lightblue,0.5]

Läbipaistvana paistab tumedam värv samasugune nagu alguses:

Graphics[{Opacity[0.5],compensateTransparency[lightred,0.5],Rectangle[{0,0}],Opacity[0.5],compensateTransparency[lightblue,0.5],Rectangle[{1/3,1/3}]}]

Kui läbipaistvus on liiga suur, on tumedaks tegemisel piir ees:

compensateTransparency[lightblue,0.2]