Skip to content

Commit

Permalink
Merged changes from Hecktorzr that determine minimum color threshold …
Browse files Browse the repository at this point in the history
…dynamically based on image size. Minor tweaks to color art class to simplify it.
  • Loading branch information
wadeco committed Dec 12, 2012
1 parent 1baab52 commit 8e9f886
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 58 deletions.
2 changes: 1 addition & 1 deletion ColorArt/AppDelegate.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,5 @@
@property (weak) IBOutlet NSImageView *imageView;
@property (weak) IBOutlet NSTextField *primaryField;
@property (weak) IBOutlet NSTextField *secondaryField;
@property (weak) IBOutlet NSTextField *secondary1Field;
@property (weak) IBOutlet NSTextField *detailField;
@end
2 changes: 1 addition & 1 deletion ColorArt/AppDelegate.m
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ - (IBAction)chooseImage:(id)sender
self.window.backgroundColor = colorArt.backgroundColor;
self.primaryField.textColor = colorArt.primaryColor;
self.secondaryField.textColor = colorArt.secondaryColor;
self.secondary1Field.textColor = colorArt.detailColor;
self.detailField.textColor = colorArt.detailColor;
}
}
}];
Expand Down
8 changes: 4 additions & 4 deletions ColorArt/SLColorArt.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@
#import <Foundation/Foundation.h>

@interface SLColorArt : NSObject
@property(copy, readonly) NSColor *backgroundColor;
@property(copy, readonly) NSColor *primaryColor;
@property(copy, readonly) NSColor *secondaryColor;
@property(copy, readonly) NSColor *detailColor;
@property(retain, readonly) NSColor *backgroundColor;
@property(retain, readonly) NSColor *primaryColor;
@property(retain, readonly) NSColor *secondaryColor;
@property(retain, readonly) NSColor *detailColor;
@property(nonatomic, copy) NSImage *scaledImage;

- (id)initWithImage:(NSImage*)image scaledSize:(NSSize)size;
Expand Down
71 changes: 26 additions & 45 deletions ColorArt/SLColorArt.m
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,6 @@

#define kColorThresholdMinimumPercentage 0.01

#define kAnalyzedBackgroundColor @"kAnalyzedBackgroundColor"
#define kAnalyzedPrimaryColor @"kAnalyzedPrimaryColor"
#define kAnalyzedSecondaryColor @"kAnalyzedSecondaryColor"
#define kAnalyzedDetailColor @"kAnalyzedDetailColor"

@interface NSColor (DarkAddition)

- (BOOL)pc_isDarkColor;
Expand All @@ -44,15 +39,17 @@ - (id)initWithColor:(NSColor*)color count:(NSUInteger)count;

@end


@interface SLColorArt ()
@property(nonatomic, copy) NSImage *image;

@property NSSize scaledSize;
@property(copy,readwrite) NSColor *backgroundColor;
@property(copy,readwrite) NSColor *primaryColor;
@property(copy,readwrite) NSColor *secondaryColor;
@property(copy,readwrite) NSColor *detailColor;
@property(retain,readwrite) NSColor *backgroundColor;
@property(retain,readwrite) NSColor *primaryColor;
@property(retain,readwrite) NSColor *secondaryColor;
@property(retain,readwrite) NSColor *detailColor;
@end


@implementation SLColorArt

- (id)initWithImage:(NSImage*)image scaledSize:(NSSize)size
Expand All @@ -61,32 +58,19 @@ - (id)initWithImage:(NSImage*)image scaledSize:(NSSize)size

if (self)
{
int x = 3;


self.image = image;
self.scaledSize = size;
[self _processImage];

NSImage *finalImage = [self scaleImage:image size:size];
self.scaledImage = finalImage;

[self analyzeImage:image];
}

return self;
}

- (void)_processImage
{
NSImage *finalImage = [self _scaleImage:self.image size:self.scaledSize];

NSDictionary *colors = [self _analyzeImage:self.image];

self.backgroundColor = [colors objectForKey:kAnalyzedBackgroundColor];
self.primaryColor = [colors objectForKey:kAnalyzedPrimaryColor];
self.secondaryColor = [colors objectForKey:kAnalyzedSecondaryColor];
self.detailColor = [colors objectForKey:kAnalyzedDetailColor];

self.scaledImage = finalImage;
}

- (NSImage*)_scaleImage:(NSImage*)image size:(NSSize)scaledSize
- (NSImage*)scaleImage:(NSImage*)image size:(NSSize)scaledSize
{
NSSize imageSize = [image size];
NSImage *squareImage = [[NSImage alloc] initWithSize:NSMakeSize(imageSize.width, imageSize.width)];
Expand Down Expand Up @@ -122,16 +106,16 @@ - (NSImage*)_scaleImage:(NSImage*)image size:(NSSize)scaledSize
return finalImage;
}

- (NSDictionary*)_analyzeImage:(NSImage*)anImage
- (void)analyzeImage:(NSImage*)anImage
{
NSCountedSet *imageColors = nil;
NSColor *backgroundColor = [self _findEdgeColor:anImage imageColors:&imageColors];
NSColor *backgroundColor = [self findEdgeColor:anImage imageColors:&imageColors];
NSColor *primaryColor = nil;
NSColor *secondaryColor = nil;
NSColor *detailColor = nil;
BOOL darkBackground = [backgroundColor pc_isDarkColor];

[self _findTextColors:imageColors primaryColor:&primaryColor secondaryColor:&secondaryColor detailColor:&detailColor backgroundColor:backgroundColor];
[self findTextColors:imageColors primaryColor:&primaryColor secondaryColor:&secondaryColor detailColor:&detailColor backgroundColor:backgroundColor];

if ( primaryColor == nil )
{
Expand Down Expand Up @@ -160,17 +144,13 @@ - (NSDictionary*)_analyzeImage:(NSImage*)anImage
detailColor = [NSColor blackColor];
}

NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:4];
[dict setObject:backgroundColor forKey:kAnalyzedBackgroundColor];
[dict setObject:primaryColor forKey:kAnalyzedPrimaryColor];
[dict setObject:secondaryColor forKey:kAnalyzedSecondaryColor];
[dict setObject:detailColor forKey:kAnalyzedDetailColor];


return [NSDictionary dictionaryWithDictionary:dict];
self.backgroundColor = backgroundColor;
self.primaryColor = primaryColor;
self.secondaryColor = secondaryColor;
self.detailColor = detailColor;
}

- (NSColor*)_findEdgeColor:(NSImage*)image imageColors:(NSCountedSet**)colors
- (NSColor*)findEdgeColor:(NSImage*)image imageColors:(NSCountedSet**)colors
{
NSBitmapImageRep *imageRep = [[image representations] lastObject];

Expand Down Expand Up @@ -209,7 +189,7 @@ - (NSColor*)_findEdgeColor:(NSImage*)image imageColors:(NSCountedSet**)colors
{
NSUInteger colorCount = [leftEdgeColors countForObject:curColor];

int randomColorsThreshold = (int) (pixelsHigh * kColorThresholdMinimumPercentage);
NSInteger randomColorsThreshold = (NSInteger)(pixelsHigh * kColorThresholdMinimumPercentage);

if ( colorCount <= randomColorsThreshold ) // prevent using random colors, threshold based on input image height
continue;
Expand All @@ -234,7 +214,7 @@ - (NSColor*)_findEdgeColor:(NSImage*)image imageColors:(NSCountedSet**)colors
{
PCCountedColor *nextProposedColor = [sortedColors objectAtIndex:i];

if (((double)nextProposedColor.count / (double)proposedEdgeColor.count) > .4 ) // make sure the second choice color is 40% as common as the first choice
if (((double)nextProposedColor.count / (double)proposedEdgeColor.count) > .3 ) // make sure the second choice color is 30% as common as the first choice
{
if ( ![nextProposedColor.color pc_isBlackOrWhite] )
{
Expand All @@ -255,7 +235,7 @@ - (NSColor*)_findEdgeColor:(NSImage*)image imageColors:(NSCountedSet**)colors
}


- (void)_findTextColors:(NSCountedSet*)colors primaryColor:(NSColor**)primaryColor secondaryColor:(NSColor**)secondaryColor detailColor:(NSColor**)detailColor backgroundColor:(NSColor*)backgroundColor
- (void)findTextColors:(NSCountedSet*)colors primaryColor:(NSColor**)primaryColor secondaryColor:(NSColor**)secondaryColor detailColor:(NSColor**)detailColor backgroundColor:(NSColor*)backgroundColor
{
NSEnumerator *enumerator = [colors objectEnumerator];
NSColor *curColor = nil;
Expand Down Expand Up @@ -310,6 +290,7 @@ - (void)_findTextColors:(NSCountedSet*)colors primaryColor:(NSColor**)primaryCol

@end


@implementation NSColor (DarkAddition)

- (BOOL)pc_isDarkColor
Expand Down Expand Up @@ -429,7 +410,7 @@ - (BOOL)pc_isContrastingColor:(NSColor*)color
else
contrast = (fLum + 0.05) / (bLum + 0.05);

//return contrast > 3.0; //3-4.5
//return contrast > 3.0; //3-4.5 W3C recommends 3:1 ratio, but that filters too many colors
return contrast > 1.6;
}

Expand Down
32 changes: 25 additions & 7 deletions ColorArt/en.lproj/MainMenu.xib
Original file line number Diff line number Diff line change
Expand Up @@ -1351,7 +1351,6 @@
<string key="NSFrame">{{237, 0}, {320, 320}}</string>
<reference key="NSSuperview" ref="439893737"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="NSEnabled">YES</bool>
<object class="NSImageCell" key="NSCell" id="806285279">
Expand Down Expand Up @@ -2192,6 +2191,14 @@
</object>
<int key="connectionID">580</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">detailField</string>
<reference key="source" ref="976324537"/>
<reference key="destination" ref="829084727"/>
</object>
<int key="connectionID">716</int>
</object>
</array>
<object class="IBMutableOrderedSet" key="objectRecords">
<array key="orderedObjects">
Expand Down Expand Up @@ -3436,21 +3443,36 @@
<nil key="activeLocalization"/>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">715</int>
<int key="maxID">716</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
<object class="IBPartialClassDescription">
<string key="className">AppDelegate</string>
<string key="superclassName">NSObject</string>
<object class="NSMutableDictionary" key="actions">
<string key="NS.key.0">chooseImage:</string>
<string key="NS.object.0">id</string>
</object>
<object class="NSMutableDictionary" key="actionInfosByName">
<string key="NS.key.0">chooseImage:</string>
<object class="IBActionInfo" key="NS.object.0">
<string key="name">chooseImage:</string>
<string key="candidateClassName">id</string>
</object>
</object>
<dictionary class="NSMutableDictionary" key="outlets">
<string key="detailField">NSTextField</string>
<string key="imageView">NSImageView</string>
<string key="primaryField">NSTextField</string>
<string key="secondary1Field">NSTextField</string>
<string key="secondaryField">NSTextField</string>
<string key="window">NSWindow</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
<object class="IBToOneOutletInfo" key="detailField">
<string key="name">detailField</string>
<string key="candidateClassName">NSTextField</string>
</object>
<object class="IBToOneOutletInfo" key="imageView">
<string key="name">imageView</string>
<string key="candidateClassName">NSImageView</string>
Expand All @@ -3459,10 +3481,6 @@
<string key="name">primaryField</string>
<string key="candidateClassName">NSTextField</string>
</object>
<object class="IBToOneOutletInfo" key="secondary1Field">
<string key="name">secondary1Field</string>
<string key="candidateClassName">NSTextField</string>
</object>
<object class="IBToOneOutletInfo" key="secondaryField">
<string key="name">secondaryField</string>
<string key="candidateClassName">NSTextField</string>
Expand Down

0 comments on commit 8e9f886

Please sign in to comment.