react-native-navigation的迁移库

UIColor+RNNUtils.m 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #import "UIColor+RNNUtils.h"
  2. // Observer 2°, D65 Illuminant
  3. #define REFX_O2_D65 95.047
  4. #define REFY_O2_D65 100.0
  5. #define REFZ_O2_D65 108.883
  6. @implementation UIColor (RNNUtils)
  7. #pragma mark Public
  8. - (NSString *)toHex {
  9. const CGFloat *components = CGColorGetComponents([self CGColor]);
  10. CGFloat r = components[0];
  11. CGFloat g = components[1];
  12. CGFloat b = components[2];
  13. return [NSString stringWithFormat:@"#%02lX%02lX%02lX",
  14. lroundf((float) (r * 255)),
  15. lroundf((float) (g * 255)),
  16. lroundf((float) (b * 255))];
  17. }
  18. + (void)rgbToLabx:(CGFloat)r g:(CGFloat)g b:(CGFloat)b l:(CGFloat *)outL a:(CGFloat *)outA b:(CGFloat *)outB {
  19. CGFloat x,y,z;
  20. [UIColor rgbToXYZr:r g:g b:b x:&x y:&y z:&z];
  21. [UIColor xyzToLabx:x y:y z:z l:outL a:outA b:outB];
  22. }
  23. #pragma mark Private
  24. + (void)rgbToXYZr:(CGFloat)r g:(CGFloat)g b:(CGFloat)b x:(CGFloat *)outX y:(CGFloat *)outY z:(CGFloat *)outZ {
  25. if(r > 0.04045) { r = pow(((r + 0.055) / 1.055),2.4); }
  26. else { r = r / 12.92; }
  27. if(g > 0.04045) { g = pow(((g + 0.055) / 1.055),2.4); }
  28. else { g = g / 12.92; }
  29. if(b > 0.04045) { b = pow(((b + 0.055) / 1.055),2.4); }
  30. else { b = b / 12.92; }
  31. r *= 100.0;
  32. g *= 100.0;
  33. b *= 100.0;
  34. *outX = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
  35. *outY = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
  36. *outZ = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);
  37. }
  38. + (void)xyzToLabx:(CGFloat)x y:(CGFloat)y z:(CGFloat)z l:(CGFloat *)outL a:(CGFloat *)outA b:(CGFloat *)outB {
  39. x /= REFX_O2_D65;
  40. y /= REFY_O2_D65;
  41. z /= REFZ_O2_D65;
  42. if(x > 0.008856) { x = pow(x, 1.0/3.0);} else {x = (7.787 * x) +(16.0/116.0);}
  43. if(y > 0.008856) { y = pow(y, 1.0/3.0);} else {y = (7.787 * y) +(16.0/116.0);}
  44. if(z > 0.008856) { z = pow(z, 1.0/3.0);} else {z = (7.787 * z) +(16.0/116.0);}
  45. *outL = (116.0 * y) - 16.0;
  46. *outA = 500.0 * (x - y);
  47. *outB = 200.0 * (y - z);
  48. }
  49. @end