Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!

void contrastFilter(unsigned char * imageData, size_t dataSize, int contrast) // contrast (256 - normal)
{
unsigned char buf[256];
unsigned int midBright = 0;
for (size_t i = 0; i < dataSize; i += 3)
midBright += imageData[i] * 77 + imageData[i + 1] * 150 + imageData[i + 2] * 29;
midBright /= (256 * dataSize / 3);
for (size_t i = 0; i < 256; i++)
{
int a = (((i - midBright) * contrast) >> 8) + midBright;
if (a < 0) buf[i] = 0;
else if (a > 255) buf[i] = 255;
else buf[i] = a;
}
for (size_t i = 0; i < dataSize; i++)
imageData[i] = buf[imageData[i]];
}
midBright += imageData[i] * 77 + imageData[i + 1] * 150 + imageData[i + 2] * 29; разные? Потому что глаз воспринимает по-разному? И последнее — в одном случае вы умножаете на 256 256 * dataSize, а в другом делаете так >> 8. Не ухудшает ли это читаемость кода? unsigned int midBright = 0, midBright1 = 0, midBright2 = 0;
for (size_t i = 0; i < dataSize; )
{
midBright += imageData[i++];
midBright1 += imageData[i++];
midBright2 += imageData[i++];
}
midBright = (midBright * 77 + midBright1 * 150 + midBright2 * 29) / (256 * dataSize / 3);
Реализация RGB-алгоритма изменения контраста изображения