colour lib needs reviewers

John Colvin via Digitalmars-d digitalmars-d at puremagic.com
Mon Sep 12 08:30:47 PDT 2016


On Monday, 12 September 2016 at 13:04:49 UTC, Manu wrote:
>
>> 2. Q: is there anything to convert a color to grey scale ?
>
> This isn't a short-answer question :) .. There are many ways 
> depending on the job.
>
> A simple way might be:
>   L8 grey = cast(L8)RGB8(r, g, b); // L8 is luminance only, 
> casting
> will do the right thing
>
> This is the 'normal' way, but there are better ways...
>
> A superior way if you want a top-quality result would be to use 
> the Lab luminance value, since Lab is perceptually uniform, 
> when you desaturate, it maintains the colors relative luminance 
> correctly, something like:
>
>   Lab!float lab = cast(Lab!float)RGB8(r, g, b); // cast your 
> color to Lab
>   lab.a = 0; // eliminate saturation on a axis
>   lab.b = 0; // eliminate saturation on b axis
>   // lab.L is now pure luminance
>   RGB8 c = cast(RGB8)lab; // cast it back to RGB, and your RGB 
> will be
> greyscale, but with more perceptually correct conversion.
>
> Lots of pow's in that conversion, so it's slower.
>
> This link demonstrates some competing techniques:
> https://en.wikipedia.org/wiki/HSL_and_HSV#/media/File:Fire-breather_CIELAB_L*.jpg
> Press left/right to cycle through them.
> The first method (cast to L8) is: Rec. 601 luma Y′.  (or more
> accurately, my code above would be: sRGB luma Y')
> The second method (Lab.L) is: CIELAB L*.
>
> L* performs much better in low light.

Is there some uniform policy w.r.t. casts here? If I take one 
colour type and cast it to another will it always do something 
unambiguously right or not compile? Seems to me that a function 
that takes a target type would be more obvious for the user.

I think the multiple different meanings of cast are a mistake in 
D. We can't go back now, but I wish there was only 
reinterpet_cast and everything else was a function.


More information about the Digitalmars-d mailing list