[R] color blending and transparency

Duncan Murdoch murdoch at stats.uwo.ca
Wed Feb 3 16:38:55 CET 2010


On 03/02/2010 9:38 AM, baptiste auguie wrote:
> That makes perfect sense, thank you, except that I'm not sure where
> the white comes from when I set the background to transparent?
>   

You'd have to check the png device documentation or source code to find 
out what it does when you mix half red with half transparent.  When I 
view a .png file
in the default viewer in Windows 7, setting the background to 
transparent displays it as white, I don't see the things behind the 
window showing through.  I don't know if it's the viewer or the file 
determining that.

Duncan Murdoch
> png("testingOrder.png", bg = "transparent")
> plot.new()
> par(bg="transparent")
> rect(0.3, 0.5, 1, 1, col=rgb(1, 0, 0, alpha=0.5))
> rect(0, 0.5, 0.7, 1, col=rgb(0, 0, 1, alpha=0.5))
>
> rect(0, 0, 0.7, 0.5, col=rgb(0, 0, 1, alpha=0.5))
> rect(0.3, 0, 1, 0.5, col=rgb(1, 0, 0, alpha=0.5))
>
> dev.off()
>
> Still produces two different overlap colours, although I *think* only
> two colours are involved. What I have I missed here?
>
> Thanks,
>
> baptiste
>
>
> On 3 February 2010 15:17, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
> > On 03/02/2010 8:50 AM, Ken Knoblauch wrote:
> >>
> >> baptiste auguie <baptiste.auguie <at> googlemail.com> writes:
> >>>
> >>> Adding two semi-transparent colours results in non-intuitive colour
> >>> mixing (a mystery for me anyway). Is it additive (light), substractive
> >>> (paint), or something else? Consider the following example, depending
> >>> on the order of the two "layers" the overlap region is either purple
> >>> or dark red. I have no idea why.
> >>>
> >>> png("testingOrder.png")
> >>> plot.new()
> >>>
> >>> # Red below
> >>> rect(0.3, 0.5, 1, 1, col=rgb(1, 0, 0, alpha=0.5))
> >>> rect(0, 0.5, 0.7, 1, col=rgb(0, 0, 1, alpha=0.5))
> >>>
> >>> # Blue below
> >>> rect(0, 0, 0.7, 0.5, col=rgb(0, 0, 1, alpha=0.5))
> >>> rect(0.3, 0, 1, 0.5, col=rgb(1, 0, 0, alpha=0.5))
> >
> > I think it's a fairly simple calculation.  In the first example: We are
> > writing red (1,0,0) at alpha=0.5 onto white (1,1,1), so we get a mixture of
> > half existing and half new, i.e. (1,0.5,0.5).  Then we write blue (0,0,1) at
> > alpha 0.5 onto that, giving (0.5, 0.25, 0.75).
> >
> > In the second pair, the first write yields (0.5,0.5,1), and the second
> > yields (0.75, 0.25, 0.5).
> >
> > So this is like mixing paints:  you don't get the same colour if you mix
> > equal parts red and white, then take equal parts of that mixture with blue,
> > as you get if you put the blue in first.  You've got less red in the first
> > mixture than in the second.
> >
> > You would get the same color in both mixtures if you didn't mix the white
> > in:
> >
> > # Red below
> > rect(0.3, 0.5, 1, 1, col=rgb(1, 0, 0, alpha=1))
> > rect(0, 0.5, 0.7, 1, col=rgb(0, 0, 1, alpha=0.5))
> >
> > # Blue below
> > rect(0, 0, 0.7, 0.5, col=rgb(0, 0, 1, alpha=1))
> > rect(0.3, 0, 1, 0.5, col=rgb(1, 0, 0, alpha=0.5))
> >
> >
> > Duncan Murdoch
> >
> >>>
> >>> dev.off()
> >>
> >> I would expect overlaid transparencies to act like filters and
> >> multiply, producing so-called subtractive color mixing,
> >> so blue and yellow gives green.  Interestingly, however,
> >> overlaying filters is not necessarily a commutative operation, since a
> >> transparent filter can yield an
> >> additive component (through scatter, for example)
> >> though I suspect that the non-commutativity comes
> >> about in R because these rules apply to physical lights,
> >> filters and surfaces and in R, it is some uncalibrated combination
> >> of frame buffer values that is being used.
> >>>
> >>> Best,
> >>>
> >>> baptiste
> >>>
> >>
> >> Ken
> >>
> >
> > ______________________________________________
> > R-help at r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> > and provide commented, minimal, self-contained, reproducible code.
> >
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>



More information about the R-help mailing list