From 8e9f88628b859c767c1ff5cfe2e1d5568fc0a32b Mon Sep 17 00:00:00 2001 From: wadeco Date: Wed, 12 Dec 2012 10:27:01 -0800 Subject: [PATCH] Merged changes from Hecktorzr that determine minimum color threshold dynamically based on image size. Minor tweaks to color art class to simplify it. --- ColorArt/AppDelegate.h | 2 +- ColorArt/AppDelegate.m | 2 +- ColorArt/SLColorArt.h | 8 ++-- ColorArt/SLColorArt.m | 71 +++++++++++++--------------------- ColorArt/en.lproj/MainMenu.xib | 32 +++++++++++---- 5 files changed, 57 insertions(+), 58 deletions(-) diff --git a/ColorArt/AppDelegate.h b/ColorArt/AppDelegate.h index 049c977..94ba726 100644 --- a/ColorArt/AppDelegate.h +++ b/ColorArt/AppDelegate.h @@ -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 \ No newline at end of file diff --git a/ColorArt/AppDelegate.m b/ColorArt/AppDelegate.m index 69607b7..2e0524c 100644 --- a/ColorArt/AppDelegate.m +++ b/ColorArt/AppDelegate.m @@ -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; } } }]; diff --git a/ColorArt/SLColorArt.h b/ColorArt/SLColorArt.h index 61f6d42..7507a6f 100644 --- a/ColorArt/SLColorArt.h +++ b/ColorArt/SLColorArt.h @@ -18,10 +18,10 @@ #import @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; diff --git a/ColorArt/SLColorArt.m b/ColorArt/SLColorArt.m index a49906a..3d03304 100644 --- a/ColorArt/SLColorArt.m +++ b/ColorArt/SLColorArt.m @@ -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; @@ -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 @@ -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)]; @@ -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 ) { @@ -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]; @@ -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; @@ -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] ) { @@ -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; @@ -310,6 +290,7 @@ - (void)_findTextColors:(NSCountedSet*)colors primaryColor:(NSColor**)primaryCol @end + @implementation NSColor (DarkAddition) - (BOOL)pc_isDarkColor @@ -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; } diff --git a/ColorArt/en.lproj/MainMenu.xib b/ColorArt/en.lproj/MainMenu.xib index 02518f0..bf5f067 100644 --- a/ColorArt/en.lproj/MainMenu.xib +++ b/ColorArt/en.lproj/MainMenu.xib @@ -1351,7 +1351,6 @@ {{237, 0}, {320, 320}} - _NS:9 YES @@ -2192,6 +2191,14 @@ 580 + + + detailField + + + + 716 + @@ -3436,21 +3443,36 @@ - 715 + 716 AppDelegate NSObject + + chooseImage: + id + + + chooseImage: + + chooseImage: + id + + + NSTextField NSImageView NSTextField - NSTextField NSTextField NSWindow + + detailField + NSTextField + imageView NSImageView @@ -3459,10 +3481,6 @@ primaryField NSTextField - - secondary1Field - NSTextField - secondaryField NSTextField