Last active
June 7, 2017 18:26
-
-
Save erkanyildiz/2b0598daae9ffd19648d to your computer and use it in GitHub Desktop.
Simple UIImage with digital camouflage patterns (Woodland, Snow, Desert, Naval, Savanna, Airborne, Ocean, Arid)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// erkanyildiz | |
// 20160620-1913 | |
// | |
// EYDigitalCamouflageImage.h | |
#import <UIKit/UIKit.h> | |
typedef enum:NSInteger | |
{ | |
EYDCIWoodland, | |
EYDCISnow, | |
EYDCIDesert, | |
EYDCINaval, | |
EYDCISavanna, | |
EYDCIAirborne, | |
EYDCIOcean, | |
EYDCIArid, | |
EYDigitalCamouflageImagePatternCount | |
} EYDigitalCamouflageImagePattern; | |
@interface EYDigitalCamouflageImage : UIImage | |
+ (UIImage *)imageWithSize:(CGSize)size andPattern:(EYDigitalCamouflageImagePattern)pattern; | |
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// erkanyildiz | |
// 20160620-1913 | |
// | |
// EYDigitalCamouflageImage.m | |
#import "EYDigitalCamouflageImage.h" | |
@implementation EYDigitalCamouflageImage | |
+ (UIImage *)imageWithSize:(CGSize)size andPattern:(EYDigitalCamouflageImagePattern)pattern | |
{ | |
const int numberOfPixels = 40; // number of pixels on the short side of the image | |
const int splashMinimum = 5; // minimum number of pixels in a splash | |
const int splashMaximum = 20; // maximum number of pixels in a splash | |
const float reducer = 0.08; // 0.08 is the magic number | |
int width = size.width; | |
int height = size.height; | |
int pixelSize = MIN(width, height) / numberOfPixels; | |
int numberOfSplashes = reducer * (width * height / (pixelSize * pixelSize)); | |
NSArray* colors = [self.class patternColors][pattern % EYDigitalCamouflageImagePatternCount]; | |
UIGraphicsBeginImageContextWithOptions(size, NO, UIScreen.mainScreen.scale); | |
CGContextRef context = UIGraphicsGetCurrentContext(); | |
CGRect bgRect = (CGRect){0, 0, size.width, size.height}; | |
[(UIColor*)colors[0] set]; | |
CGContextFillRect(context, bgRect); // draw background | |
for (int i = 0; i < numberOfSplashes; i++) | |
{ | |
int x = arc4random() % (width / pixelSize); // random start of splash, x | |
int y = arc4random() % (height / pixelSize); // random start of splash, y | |
int c = arc4random() % (colors.count-1) +1; // randomly chosen splash color (except background color) | |
[(UIColor*)colors[c] set]; // set pixel color | |
int splashPixelCount = (int) splashMinimum + arc4random() % (splashMaximum-splashMinimum); | |
splashPixelCount *= (colors.count-c); // color balancing proportional to color index | |
for (int j = 0; j < splashPixelCount; j++) | |
{ | |
int dX = (arc4random() % 3) -1; // random direction of splash, x | |
int dY = (arc4random() % 3) -1; // random direction of splash, y | |
x = x + dX; | |
y = y + dY; | |
CGRect pixelRect = (CGRect){x * pixelSize, y * pixelSize, pixelSize, pixelSize}; | |
CGContextFillRect(context, pixelRect); // draw pixel | |
} | |
} | |
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); | |
UIGraphicsEndImageContext(); | |
return image; | |
} | |
+ (NSArray*)patternColors | |
{ | |
#define RGB(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1] | |
// colors for patterns are ordered from most used (background color) to least used | |
NSArray* colors = @[ | |
@[ RGB(156,136,109), //EYDCIWoodland | |
RGB(88,109,89), | |
RGB(57,57,59), | |
RGB(165,157,142) | |
], | |
@[ RGB(255,255,255), //EYDCISnow | |
RGB(151,153,152), | |
RGB(112, 129,136), | |
RGB(78,85,77) | |
], | |
@[ RGB(214,186,146), //EYDCIDesert | |
RGB(234,196,169), | |
RGB(241,214,194), | |
RGB(148,104,70) | |
], | |
@[ RGB(165,179,193), //EYDCINaval | |
RGB(86,108,117), | |
RGB(44,65,91), | |
RGB(31,35,40) | |
], | |
@[ RGB(100,133,64), //EYDCISavanna | |
RGB(42,82,11), | |
RGB(210,130,7), | |
RGB(92,18,7) | |
], | |
@[ RGB(198,205,197), //EYDCIAirborne | |
RGB(246,235,218), | |
RGB(103,118,111), | |
RGB(75,93,97) | |
], | |
@[ RGB(71,179,169), //EYDCIOcean | |
RGB(0,124,73), | |
RGB(255,255,255), | |
RGB(0,0,0) | |
], | |
@[ RGB(238,225,203), //EYDCIArid | |
RGB(119,139,98), | |
RGB(191,104,73), | |
RGB(70,68,69) | |
] | |
]; | |
return colors; | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Woodland
Snow
Desert
Naval
Savanna
Airborne
Ocean
Arid