-
Notifications
You must be signed in to change notification settings - Fork 4.6k
/
SimpleImageViewController.m
100 lines (76 loc) · 3.38 KB
/
SimpleImageViewController.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
#import "SimpleImageViewController.h"
@implementation SimpleImageViewController
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
#pragma mark - View lifecycle
- (void)loadView
{
CGRect mainScreenFrame = [[UIScreen mainScreen] applicationFrame];
GPUImageView *primaryView = [[GPUImageView alloc] initWithFrame:mainScreenFrame];
self.view = primaryView;
[self setupDisplayFiltering];
[self setupImageFilteringToDisk];
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if (interfaceOrientation == UIInterfaceOrientationPortrait)
{
return YES;
}
return NO;
}
#pragma mark -
#pragma mark Image filtering
- (void)setupDisplayFiltering;
{
UIImage *inputImage = [UIImage imageNamed:@"WID-small.jpg"]; // The WID.jpg example is greater than 2048 pixels tall, so it fails on older devices
sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES];
sepiaFilter = [[GPUImageSepiaFilter alloc] init];
GPUImageView *imageView = (GPUImageView *)self.view;
[sourcePicture addTarget:sepiaFilter];
[sepiaFilter addTarget:imageView];
[sourcePicture processImage];
}
- (void)setupImageFilteringToDisk;
{
// Set up a manual image filtering chain
UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"];
GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage];
GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init];
// GPUImageSketchFilter *stillImageFilter = [[GPUImageSketchFilter alloc] init];
// There's a problem with the Kuwahara filter where it doesn't finish rendering before the image is extracted from it.
// It looks like it only gets through certain tiles before glReadPixels() is called. Odd.
// GPUImageKuwaharaFilter *stillImageFilter = [[GPUImageKuwaharaFilter alloc] init];
// stillImageFilter.radius = 9;
[stillImageSource addTarget:stillImageFilter];
[stillImageSource processImage];
UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentlyProcessedOutput];
// Do a simpler image filtering
// GPUImageSepiaFilter *stillImageFilter2 = [[GPUImageSepiaFilter alloc] init];
GPUImageSketchFilter *stillImageFilter2 = [[GPUImageSketchFilter alloc] init];
UIImage *quickFilteredImage = [stillImageFilter2 imageByFilteringImage:inputImage];
// Write images to disk, as proof
NSData *dataForPNGFile = UIImagePNGRepresentation(currentFilteredVideoFrame);
NSData *dataForPNGFile2 = UIImagePNGRepresentation(quickFilteredImage);
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSError *error = nil;
if (![dataForPNGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:@"Lambeau-filtered1.png"] options:NSAtomicWrite error:&error])
{
return;
}
if (![dataForPNGFile2 writeToFile:[documentsDirectory stringByAppendingPathComponent:@"Lambeau-filtered2.png"] options:NSAtomicWrite error:&error])
{
return;
}
}
@end