#include "helpers.h"
#include <math.h>
// Convert image to grayscale
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
int total = 0;
float avg = 0;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
total = image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue;
avg = total / 3.00;
image[i][j].rgbtRed = round(avg);
image[i][j].rgbtGreen = round(avg);
image[i][j].rgbtBlue = round(avg);
}
}
return;
}
// Convert image to sepia
void sepia(int height, int width, RGBTRIPLE image[height][width])
{
float sepia_red = 0;
float sepia_green = 0;
float sepia_blue = 0;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
sepia_red = (.393 * image[i][j].rgbtRed + .769 * image[i][j].rgbtGreen + .189 * image[i][j].rgbtBlue);
sepia_green = (.349*image[i][j].rgbtRed) + (.686*image[i][j].rgbtGreen) + (.168*image[i][j].rgbtBlue);
sepia_blue = (.272*image[i][j].rgbtRed) + (.534*image[i][j].rgbtGreen) + (.131*image[i][j].rgbtBlue);
if (sepia_red > 255)
{
sepia_red = 255;
}
if (sepia_green > 255)
{
sepia_green = 255;
}
if (sepia_blue > 255)
{
sepia_blue = 255;
}
image[i][j].rgbtRed = round(sepia_red);
image[i][j].rgbtGreen = round(sepia_green);
image[i][j].rgbtBlue = round(sepia_blue);
}
}
return;
}
// Reflect image horizontally
void reflect(int height, int width, RGBTRIPLE image[height][width])
{
int temp[3];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width/2; j ++)
{
temp[0] = image[i][j].rgbtRed;
temp[1] = image[i][j].rgbtGreen;
temp[2] = image[i][j].rgbtBlue;
image[i][j].rgbtRed = image[i][width - j - 1].rgbtRed;
image[i][j].rgbtGreen = image[i][width - j - 1].rgbtGreen;
image[i][j].rgbtBlue = image[i][width - j - 1].rgbtBlue;
image[i][width - j - 1].rgbtRed = temp[0];
image[i][width - j - 1].rgbtGreen = temp[1];
image[i][width - j - 1].rgbtBlue = temp[2];
}
}
return;
}
// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{
int total = 0;
float count = 0;
int elements = 0;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
for (int x = i - 1; x <= i + 1; x++)
{
if (x >= 0 && x <= height - 1)
{
elements++;
}
}
for (int y = j - 1; y <= j + 1; y++)
{
if (y >= 0 && y < width - 1)
{
elements++;
}
}
total = image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue;
count = total / elements;
image[i][j].rgbtRed = round(count);
image[i][j].rgbtGreen = round(count);
image[i][j].rgbtBlue = round(count);
}
}
return;
}
После нескольких сообщений на Reddit мне сказали, что мне нужно
- создать временную переменную, а затем, как только она будет создана, go об изменении исходных пикселей на значение Для временной переменной
- создайте переменную увеличения, такую как (int pixels_used), чтобы разделить на
Я не знаю, как go об этом, деление на увеличивающуюся переменную проблемы меня, потому что я думаю, что мне нужно создать red_count
, blue_count
, green_count
и pixels_used
. Я попытался написать эту форму кода здесь https://pastebin.com/UX1miGtd, поскольку она похожа на пример, который Брайан дал нам на этом рисунке https://i.stack.imgur.com/K7rVL.png. Мы складываем общее количество красного, зеленого и синего, а затем назначаем выбранный пиксель этим числам. Очевидно, исходя из количества переменных, которые мне пришлось использовать, это выглядит не очень хорошо, и я предполагаю, что это неправильно, но у меня нет других идей.
Если кто-нибудь может помочь, я был бы очень признателен!