Pages

Showing posts with label color. Show all posts
Showing posts with label color. Show all posts

July 16, 2013

RGB to HSV Color space conversion

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

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

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

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

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)