Skip to content

Instantly share code, notes, and snippets.

@jdriscoll
Last active December 19, 2015 14:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jdriscoll/5969172 to your computer and use it in GitHub Desktop.
Save jdriscoll/5969172 to your computer and use it in GitHub Desktop.
Find the lightest (or darkest) color in an image by sampling pixels along both diagonals.
CGImageRef rawImageRef = [image CGImage];
CFDataRef imageDataRef = CGDataProviderCopyData(CGImageGetDataProvider(rawImageRef));
const UInt8 *rawPixelData = CFDataGetBytePtr(imageDataRef);
NSUInteger imageHeight = CGImageGetHeight(rawImageRef);
NSUInteger imageWidth = CGImageGetWidth(rawImageRef);
int brightness = 0;
int red = 0;
int green = 0;
int blue = 0;
int x = 0;
int y = 0;
int p = 0;
int r;
int g;
int b;
int br;
float ratio = (float)imageHeight / (float)imageWidth;
for (int i = x; i < imageWidth; i++) {
x = i;
y = floorf(x*ratio);
p = ((imageWidth * y) + x) * 4;
r = (unsigned int)rawPixelData[p];
g = (unsigned int)rawPixelData[p + 1];
b = (unsigned int)rawPixelData[p + 2];
br = (int)sqrt(r * r * .241 +
g * g * .691 +
b * b * .068);
if (br > brightness) {
brightness = br;
red = r;
green = g;
blue = b;
}
// Check the other diagonal
y = imageHeight - y;
p = ((imageWidth * y) + x) * 4;
r = (unsigned int)rawPixelData[p];
g = (unsigned int)rawPixelData[p + 1];
b = (unsigned int)rawPixelData[p + 2];
br = (int)sqrt(r * r * .241 +
g * g * .691 +
b * b * .068);
if (br > brightness) {
brightness = br;
red = r;
green = g;
blue = b;
}
if (brightness == 0)
break;
}
CFRelease(imageDataRef);
UIColor *color = [UIColor colorWithRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:1];
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment