Color space conversions is too complicated for me, so I made this useful function.
You need:
- http://objective-c-functions.blogspot.com/2013/06/helpful-color-struct-rgb-hsv.html
- http://objective-c-functions.blogspot.com/2013/07/max-value-in-array.html
- http://objective-c-functions.blogspot.com/2013/07/min-value-in-array.html
/** Convert from RGB to HSV.
RGB range is [0;255] for all channels. HSV range is [0;360] for H and [0;100] for S and V.
@param col RGB color to convert.
@return Returns HSV color.
@see rgbFromHsv:
*/
+ (COLOR_HSV)hsvFromRgb:(COLOR_RGB)col {
COLOR_HSV ret;
CGFloat min, max, delta;
NSNumber *r = [NSNumber numberWithFloat:col.r];
NSNumber *g = [NSNumber numberWithFloat:col.g];
NSNumber *b = [NSNumber numberWithFloat:col.b];
min = [LMFunctions minValueInArray:[NSArray arrayWithObjects:r, g, b, nil] withIndex:NULL];
max = [LMFunctions maxValueInArray:[NSArray arrayWithObjects:r, g, b, nil] withIndex:NULL];
delta = max - min;
ret.v = max;
if (max != 0) {
ret.s = delta/max;
} else {
// r = g = b = 0, thus s = 0, v = undefined.
ret.s = 0;
ret.h = 0;
ret.v = 0;
return ret;
}
if (delta != 0) { // To avoid division-by-zero error.
if (col.r == max) {
ret.h = (col.g - col.b) / delta; // Between yellow and magenta.
} else if (col.g == max) {
ret.h = 2 + (col.b - col.r) / delta; // Between cyan and yellow.
} else {
ret.h = 4 + (col.r - col.g) / delta; // Between magenta and cyan.
}
ret.h *= 60.0f; // Degrees.
if (ret.h < 0) {
ret.h += 360.0f;
}
} else {
ret.h = 0;
}
ret.s *= 100.0f;
ret.v *= 100.0f;
return ret;
}
Download the ready-for-use source file (.m) of RGB to HSV Color space conversion
A useful and helpful collection library of common Objective-C functions, methods, classes and categories.
Showing posts with label color. Show all posts
Showing posts with label color. Show all posts
July 16, 2013
June 27, 2013
HSV to RGB Color space conversion
Color space conversion made easy to use. Just call this useful Objective-C method.
You need:
- http://objective-c-functions.blogspot.com/2013/06/helpful-color-struct-rgb-hsv.html
/** Convert from HSV to RGB.
RGB range is [0;1] for all channels. HSV range can be anything sane ([0;360] or [0;1]).
@param col HSV color to convert.
@return Returns RGB color.
@see hsvFromRgb:
*/
+ (COLOR_RGB)rgbFromHsv:(COLOR_HSV)col {
CGFloat h1 = col.h;
CGFloat s1 = col.s;
CGFloat v1 = col.v;
CGFloat var_r, var_g, var_b;
if (h1 > 1.0f) {
h1 = h1 - (CGFloat)floorf(h1);
}
if (h1 == 1.0f) h1 = 0.0f;
if (v1 < 0.0f) v1 = 0.0f;
if (v1 > 1.0f) v1 = 1.0f;
if (s1 < 0.0f) s1 = 0.0f;
if (s1 > 1.0f) s1 = 1.0f;
if (s1 == 0.0f) {
var_r = var_g = var_b = v1;
}
else {
CGFloat var_i, var_h, var_1, var_2, var_3;
var_h = h1 * 6.0f;
var_i = (CGFloat)floorf(var_h);
var_1 = v1 * (1.0f - s1);
var_2 = v1 * (1.0f - s1 * (var_h - var_i));
var_3 = v1 * (1.0f - s1 * (1.0f - (var_h - var_i)));
if (var_i == 0.0f) {
var_r = v1;
var_g = var_3;
var_b = var_1;
}
else if (var_i == 1.0f) {
var_r = var_2;
var_g = v1;
var_b = var_1;
}
else if (var_i == 2.0f) {
var_r = var_1;
var_g = v1;
var_b = var_3;
}
else if (var_i == 3.0f) {
var_r = var_1;
var_g = var_2;
var_b = v1;
}
else if (var_i == 4.0f) {
var_r = var_3;
var_g = var_1;
var_b = v1;
}
else {
var_r = v1;
var_g = var_1;
var_b = var_2;
}
}
COLOR_RGB ret = {var_r, var_g, var_b};
return ret;
}
Download the ready-for-use source file (.m) of HSV to RGB Color space conversion
You need:
- http://objective-c-functions.blogspot.com/2013/06/helpful-color-struct-rgb-hsv.html
/** Convert from HSV to RGB.
RGB range is [0;1] for all channels. HSV range can be anything sane ([0;360] or [0;1]).
@param col HSV color to convert.
@return Returns RGB color.
@see hsvFromRgb:
*/
+ (COLOR_RGB)rgbFromHsv:(COLOR_HSV)col {
CGFloat h1 = col.h;
CGFloat s1 = col.s;
CGFloat v1 = col.v;
CGFloat var_r, var_g, var_b;
if (h1 > 1.0f) {
h1 = h1 - (CGFloat)floorf(h1);
}
if (h1 == 1.0f) h1 = 0.0f;
if (v1 < 0.0f) v1 = 0.0f;
if (v1 > 1.0f) v1 = 1.0f;
if (s1 < 0.0f) s1 = 0.0f;
if (s1 > 1.0f) s1 = 1.0f;
if (s1 == 0.0f) {
var_r = var_g = var_b = v1;
}
else {
CGFloat var_i, var_h, var_1, var_2, var_3;
var_h = h1 * 6.0f;
var_i = (CGFloat)floorf(var_h);
var_1 = v1 * (1.0f - s1);
var_2 = v1 * (1.0f - s1 * (var_h - var_i));
var_3 = v1 * (1.0f - s1 * (1.0f - (var_h - var_i)));
if (var_i == 0.0f) {
var_r = v1;
var_g = var_3;
var_b = var_1;
}
else if (var_i == 1.0f) {
var_r = var_2;
var_g = v1;
var_b = var_1;
}
else if (var_i == 2.0f) {
var_r = var_1;
var_g = v1;
var_b = var_3;
}
else if (var_i == 3.0f) {
var_r = var_1;
var_g = var_2;
var_b = v1;
}
else if (var_i == 4.0f) {
var_r = var_3;
var_g = var_1;
var_b = v1;
}
else {
var_r = v1;
var_g = var_1;
var_b = var_2;
}
}
COLOR_RGB ret = {var_r, var_g, var_b};
return ret;
}
Download the ready-for-use source file (.m) of HSV to RGB Color space conversion
June 26, 2013
How to check if a number is a valid RGB component
Make sure your every Red Green Blue Alpha component is a valid NSInteger in the range [0 ; 255].
/** Check whether a number might be a valid RGB component.
Range of RGB is [0;255].
@param num Number to test.
@return Returns true if the number is in the range, false otherwise.
*/
+ (BOOL)isValidRgbComponent:(NSInteger)num {
if (num < 0 || num > 255) {
return NO;
}
return YES;
}
Download the ready-for-use source file (.m) of How to check if a number is a valid RGB component
/** Check whether a number might be a valid RGB component.
Range of RGB is [0;255].
@param num Number to test.
@return Returns true if the number is in the range, false otherwise.
*/
+ (BOOL)isValidRgbComponent:(NSInteger)num {
if (num < 0 || num > 255) {
return NO;
}
return YES;
}
Download the ready-for-use source file (.m) of How to check if a number is a valid RGB component
June 24, 2013
Get RGBA components of UIColor
It's not so easy to get the separated Red Green Blue Alpha components from an UIColor.
But luckily you can use this helpful function.
You need:
- http://objective-c-functions.blogspot.com/2013/06/helpful-color-struct-rgb-hsv.html
/** Convert from UIColor to RGBA.
@param col UIColor to convert.
@return Returns RGBA color.
@see uicolorFromRgba:
*/
+ (COLOR_RGBA)rgbaFromUIColor:(UIColor *)col {
const CGFloat *components = CGColorGetComponents([col CGColor]);
COLOR_RGBA ret;
ret.r = components[0];
ret.g = components[1];
ret.b = components[2];
ret.a = components[3];
return ret;
}
Download the ready-for-use source file (.m) of Get RGBA components of UIColor
But luckily you can use this helpful function.
You need:
- http://objective-c-functions.blogspot.com/2013/06/helpful-color-struct-rgb-hsv.html
/** Convert from UIColor to RGBA.
@param col UIColor to convert.
@return Returns RGBA color.
@see uicolorFromRgba:
*/
+ (COLOR_RGBA)rgbaFromUIColor:(UIColor *)col {
const CGFloat *components = CGColorGetComponents([col CGColor]);
COLOR_RGBA ret;
ret.r = components[0];
ret.g = components[1];
ret.b = components[2];
ret.a = components[3];
return ret;
}
Download the ready-for-use source file (.m) of Get RGBA components of UIColor
June 23, 2013
Helpful Color Struct (RGB, HSV)
In order to do some colorimetry stuff, these custom structs are very important.
/*
*
* Custom structs for color management.
*
*/
typedef struct {
CGFloat h;
CGFloat s;
CGFloat v;
} COLOR_HSV;
typedef struct {
CGFloat r;
CGFloat g;
CGFloat b;
} COLOR_RGB;
typedef struct {
CGFloat r;
CGFloat g;
CGFloat b;
CGFloat a;
} COLOR_RGBA;
Download the ready-for-use source file (.m) of Helpful Color Struct (RGB, HSV)
/*
*
* Custom structs for color management.
*
*/
typedef struct {
CGFloat h;
CGFloat s;
CGFloat v;
} COLOR_HSV;
typedef struct {
CGFloat r;
CGFloat g;
CGFloat b;
} COLOR_RGB;
typedef struct {
CGFloat r;
CGFloat g;
CGFloat b;
CGFloat a;
} COLOR_RGBA;
Download the ready-for-use source file (.m) of Helpful Color Struct (RGB, HSV)
Subscribe to:
Posts (Atom)