Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Simple UIImage with digital camouflage patterns (Woodland, Snow, Desert, Naval, Savanna, Airborne, Ocean, Arid)
// 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
// 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
@erkanyildiz

This comment has been minimized.

Copy link
Owner Author

erkanyildiz commented Jan 4, 2016

Woodland
woodland
Snow
snow
Desert
desert
Naval
naval
Savanna
savanna
Airborne
airborne
Ocean
ocean
Arid
arid

@erkanyildiz

This comment has been minimized.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.