-
Notifications
You must be signed in to change notification settings - Fork 0
/
helpers.c
133 lines (124 loc) · 4.24 KB
/
helpers.c
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
#include <math.h>
#include "helpers.h"
// Convert image to grayscale
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
int average = round((image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue) / 3.0);
image[i][j].rgbtRed = average;
image[i][j].rgbtGreen = average;
image[i][j].rgbtBlue = average;
}
}
// Calculate the average pixel value.
// Set each color value to the average value.
return;
}
// Convert image to sepia
void sepia(int height, int width, RGBTRIPLE image[height][width])
{
// calculate each new color value using the Sepia formula
// sepiaRed = .393 * originalRed + .769 * originalGreen + .189 * originalBlue
// sepiaGreen = .349 * originalRed + .686 * originalGreen + .168 * originalBlue
// sepiaBlue = .272 * originalRed + .534 * originalGreen + .131 * originalBlue
// it must be rounded int and if value is more than 255 then it needs to be capped
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
int sepiaRed = round(0.393 * image[i][j].rgbtRed + .769 * image[i][j].rgbtGreen + .189 * image[i][j].rgbtBlue);
int sepiaGreen = round(0.349 * image[i][j].rgbtRed + .686 * image[i][j].rgbtGreen + .168 * image[i][j].rgbtBlue);
int sepiaBlue = round(0.272 * image[i][j].rgbtRed + .534 * image[i][j].rgbtGreen + .131 * image[i][j].rgbtBlue);
if (sepiaRed > 255)
{
sepiaRed = 255;
}
if (sepiaGreen > 255)
{
sepiaGreen = 255;
}
if (sepiaBlue > 255)
{
sepiaBlue = 255;
}
image[i][j].rgbtRed = sepiaRed;
image[i][j].rgbtGreen = sepiaGreen;
image[i][j].rgbtBlue = sepiaBlue;
}
}
return;
}
// Reflect image horizontally
void reflect(int height, int width, RGBTRIPLE image[height][width])
{
RGBTRIPLE buffer_row[width];
for (int i = 0; i < height; i++)
{
int k = 0;
for (int j = width - 1; j >= 0; j--)
{
buffer_row[k] = image[i][j];
k++;
}
for (int j = 0; j < width; j++)
{
image[i][j] = buffer_row[j];
}
}
// rows stays same
// for each row swap pixels horizontally
// be aware if there is odd or even number of pixels in the row
return;
}
// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{
//
RGBTRIPLE buffer[height][width];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
int averageRed = 0;
int averageGreen = 0;
int averageBlue = 0;
float counter = 0.00;
for (int h = (i - 1); h <= (i + 1); h++)
{
for (int w = (j - 1); w <= (j + 1); w++)
{
if (h >= 0 & h <= (height - 1) & w >= 0 & (w <= width - 1))
{
averageRed += image[h][w].rgbtRed;
averageGreen += image[h][w].rgbtGreen;
averageBlue += image[h][w].rgbtBlue;
counter++;
}
}
}
averageRed = round(averageRed / counter);
averageGreen = round(averageGreen / counter);
averageBlue = round(averageBlue / counter);
buffer[i][j].rgbtRed = averageRed;
buffer[i][j].rgbtGreen = averageGreen;
buffer[i][j].rgbtBlue = averageBlue;
// int average = round((image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue) / 3.0);
// image[i][j].rgbtRed = average;
// image[i][j].rgbtGreen = average;
// image[i][j].rgbtBlue = average;
}
}
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
image[i][j].rgbtRed = buffer[i][j].rgbtRed;
image[i][j].rgbtGreen = buffer[i][j].rgbtGreen;
image[i][j].rgbtBlue = buffer[i][j].rgbtBlue;
}
}
return;
}