代码来自http://www.cocoabuilder.com/archive/cocoa/198570-here-is-code-to-convert-rgb-hsb.html
C语言,可在Object-C中调用
#define UNDEFINED 0 typedef struct {float r, g, b;} RGBType; typedef struct {float h, s, v;} HSVType; // Theoretically, hue 0 (pure red) is identical to hue 6 in these transforms. Pure // red always maps to 6 in this implementation. Therefore UNDEFINED can be // defined as 0 in situations where only unsigned numbers are desired. RGBType RGBTypeMake(float r, float g, float b); HSVType HSVTypeMake(float h, float s, float v); HSVType RGB_to_HSV( RGBType RGB ); RGBType HSV_to_RGB( HSVType HSV );
#include <math.h> #include "HSV.h" inline RGBType RGBTypeMake(float r, float g, float b) { RGBType rgb = {r, g, b}; return rgb; } inline HSVType HSVTypeMake(float h, float s, float v) { HSVType hsv = {h, s, v}; return hsv; } HSVType RGB_to_HSV( RGBType RGB ) { // RGB are each on [0, 1]. S and V are returned on [0, 1] and H is // returned on [0, 1]. Exception: H is returned UNDEFINED if S==0. float R = RGB.r, G = RGB.g, B = RGB.b, v, x, f; int i; x = fminf(R, G); x = fminf(x, B); v = fmaxf(R, G); v = fmaxf(v, B); if(v == x) return HSVTypeMake(UNDEFINED, 0, v); f = (R == x) ? G - B : ((G == x) ? B - R : R - G); i = (R == x) ? 3 : ((G == x) ? 5 : 1); return HSVTypeMake(((i - f /(v - x))/6), (v - x)/v, v); } RGBType HSV_to_RGB( HSVType HSV ) { // H is given on [0, 1] or UNDEFINED. S and V are given on [0, 1]. // RGB are each returned on [0, 1]. float h = HSV.h * 6, s = HSV.s, v = HSV.v, m, n, f; int i; if (h == 0) h=.01; if(h == UNDEFINED) return RGBTypeMake(v, v, v); i = floorf(h); f = h - i; if(!(i & 1)) f = 1 - f; // if i is even m = v * (1 - s); n = v * (1 - s * f); switch (i) { case 6: case 0: return RGBTypeMake(v, n, m); case 1: return RGBTypeMake(n, v, m); case 2: return RGBTypeMake(m, v, n); case 3: return RGBTypeMake(m, n, v); case 4: return RGBTypeMake(n, m, v); case 5: return RGBTypeMake(v, m, n); } return RGBTypeMake(0, 0, 0); }