[R] color blending and transparency

baptiste auguie baptiste.auguie at googlemail.com
Wed Feb 3 16:57:05 CET 2010


On MacOSX I can tell Preview or Photoshop not to use a white
background yet the mixing still shows a difference (with either pdf or
png for that matter). So I guess it's something to do with mixing
colours with the transparent channel as you say. I'll try to find the
reason in the source code later (I haven't found any documentation on
this so far).

Thanks,

baptiste

On 3 February 2010 16:38, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
> 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