Convert RGB to HSV
Richmond Mathewson
richmondmathewson at gmail.com
Sun Jul 5 02:06:03 EDT 2009
The "magic numbers" (i.e. the conversion algorithms) are laid out very
clearly here:
http://en.wikipedia.org/wiki/HSB_color_space
which seems to predate Monte Goulding.
James Hurley wrote:
> What I have been using are the following two functions. I believe they
> originated with Monte Goulding. (With a slight addition to allow for a
> single parameter input containing the rgb values.)
> They have been VERY useful. There are times when HSV is critical.
> (Of course neither is useful in getting the RGB--or HSV--values from
> the color names.)
>
> Jim Hurley
>
> function RGBtoHSV r, g, b
> if the paramcount is 1 then
> put item 3 of r into b
> put item 2 of r into g
> put item 1 of r into r
> end if
> local maxv, minv, diff, s, rc, gc, bc, h
> set the numberFormat to "0.###############"
> put r / 255 into r
> put g / 255 into g
> put b / 255 into b
> put max(r,g,b) into maxv
> put min(r,g,b) into minv
> put maxv - minv into diff
> if maxv <> 0 and diff <> 0 then
> put diff / maxv into s
> put (maxv - r) / diff into rc
> put (maxv - g) / diff into gc
> put (maxv - b) / diff into bc
> if r = maxv then put bc - gc into h
> else if g = maxv then put 2 + rc - bc into h
> else if b = maxv then put 4 + gc - rc into h
> multiply h by 60
> if h < 0 then
> add 360 to h
> end if
> else
> put 0 into s
> put 0 into h
> end if
> return round(h),round(s * 100),round(maxv * 100)
> end RGBtoHSV
>
> function HSVtoRGB h, s, v
> if the paramcount is 1 then
> put item 3 of h into v
> put item 2 of h into s
> put item 1 of h into h
> end if
> local rgb, i, f, p, q, t
> set the numberFormat to "0.###############"
> divide s by 100
> divide v by 100
> if s is 0 then put v,v,v into rgb
> else
> divide h by 60
> put trunc(h) into i
> put h - i into f
> put v * (1 - s) into p
> put v * (1 - s * f) into q
> put v * (1 - s * (1- f)) into t
> if i is 0 then put v,t,p into rgb
> if i is 1 then put q,v,p into rgb
> if i is 2 then put p,v,t into rgb
> if i is 3 then put p,q,v into rgb
> if i is 4 then put t,p,v into rgb
> if i is 5 then put v,p,q into rgb
> end if
> return round(item 1 of rgb * 255), round(item 2 of rgb * 255),
> round(item 3 of rgb * 255)
> end HSVtoRGB
>
>
> _______________________________________________
> use-revolution mailing list
> use-revolution at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your
> subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-revolution
>
More information about the use-livecode
mailing list