-
Notifications
You must be signed in to change notification settings - Fork 14
/
UIImage+Contrast.m
134 lines (92 loc) · 4.04 KB
/
UIImage+Contrast.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
//
// UIImage+Contrast.m
//
// Created by Cory Leach on 3/14/11.
// Copyright 2011 Cory R. Leach. All rights reserved.
//
#import "UIImage+Contrast.h"
@implementation UIImage (Contrast)
- (UIImage*) imageWithContrast:(CGFloat)contrastFactor {
if ( contrastFactor == 1 ) {
return self;
}
CGImageRef imgRef = [self CGImage];
size_t width = CGImageGetWidth(imgRef);
size_t height = CGImageGetHeight(imgRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
size_t bitsPerComponent = 8;
size_t bytesPerPixel = 4;
size_t bytesPerRow = bytesPerPixel * width;
size_t totalBytes = bytesPerRow * height;
//Allocate Image space
uint8_t* rawData = malloc(totalBytes);
//Create Bitmap of same size
CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
//Draw our image to the context
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imgRef);
//Perform Brightness Manipulation
for ( int i = 0; i < totalBytes; i += 4 ) {
uint8_t* red = rawData + i;
uint8_t* green = rawData + (i + 1);
uint8_t* blue = rawData + (i + 2);
*red = MIN(255,MAX(0, roundf(contrastFactor*(*red - 127.5f)) + 128));
*green = MIN(255,MAX(0, roundf(contrastFactor*(*green - 127.5f)) + 128));
*blue = MIN(255,MAX(0, roundf(contrastFactor*(*blue - 127.5f)) + 128));
}
//Create Image
CGImageRef newImg = CGBitmapContextCreateImage(context);
//Release Created Data Structs
CGColorSpaceRelease(colorSpace);
CGContextRelease(context);
free(rawData);
//Create UIImage struct around image
UIImage* image = [UIImage imageWithCGImage:newImg];
//Release our hold on the image
CGImageRelease(newImg);
//return new image!
return image;
}
- (UIImage*) imageWithContrast:(CGFloat)contrastFactor brightness:(CGFloat)brightnessFactor {
if ( contrastFactor == 1 && brightnessFactor == 0 ) {
return self;
}
CGImageRef imgRef = [self CGImage];
size_t width = CGImageGetWidth(imgRef);
size_t height = CGImageGetHeight(imgRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
size_t bitsPerComponent = 8;
size_t bytesPerPixel = 4;
size_t bytesPerRow = bytesPerPixel * width;
size_t totalBytes = bytesPerRow * height;
//Allocate Image space
uint8_t* rawData = malloc(totalBytes);
//Create Bitmap of same size
CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
//Draw our image to the context
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imgRef);
//Perform Brightness Manipulation
for ( int i = 0; i < totalBytes; i += 4 ) {
uint8_t* red = rawData + i;
uint8_t* green = rawData + (i + 1);
uint8_t* blue = rawData + (i + 2);
*red = MIN(255,MAX(0,roundf(*red + (*red * brightnessFactor))));
*green = MIN(255,MAX(0,roundf(*green + (*green * brightnessFactor))));
*blue = MIN(255,MAX(0,roundf(*blue + (*blue * brightnessFactor))));
*red = MIN(255,MAX(0, roundf(contrastFactor*(*red - 127.5f)) + 128));
*green = MIN(255,MAX(0, roundf(contrastFactor*(*green - 127.5f)) + 128));
*blue = MIN(255,MAX(0, roundf(contrastFactor*(*blue - 127.5f)) + 128));
}
//Create Image
CGImageRef newImg = CGBitmapContextCreateImage(context);
//Release Created Data Structs
CGColorSpaceRelease(colorSpace);
CGContextRelease(context);
free(rawData);
//Create UIImage struct around image
UIImage* image = [UIImage imageWithCGImage:newImg];
//Release our hold on the image
CGImageRelease(newImg);
//return new image!
return image;
}
@end