В комментариях я дал вам несколько отзывов об ошибках в вашем коде. Вы можете исправить это самостоятельно. Возьмите отладчик для проверки / проверки всех этих предварительных шагов. Например, прочитайте файл и запишите его немедленно (и отобразите изображение), чтобы вы знали, что чтение в порядке.
Ваша основная проблема и вопрос касаются цикла.
По сути, у вас есть одномерный массив, который состоит из строки после сканирования, и каждая строка содержит пиксели. В отличие от формата BMP, в вашем формате не используются байты заполнения для выравнивания строк развертки по границам слов. Это немного облегчает.
Пиксель состоит из трех значений цвета, R, G и B, и я предполагаю, что каждое значение цвета составляет один байт (беззнаковый символ). Распределение и чтение памяти затем становится:
unsigned char *data = malloc(width*height*3);
r = fread(data, width*height*3, 1, inputFile);
Теперь цикл проходит через все строки с шагом четыре и обрабатывает каждый пиксель с шагом четыре . Таким образом, он обрабатывает один квадрат за раз, вычисляет среднее значение и записывает его:
c= 4;
for (y=0; y<height; y += c)
{
for (x=0; x<width; x += c)
{
unsigned int avgR=0, avgG=0, avgB= 0;
for (dy=0; dy<c && y+dy<height; dy++)
{
for (dx=0; dx<c && x+dx<width; dx++)
{
avgR += data[ y*width*3 // line in image
+ x*3 // pixel on line
+ dy*width*3 // line of square
+ dx*3 // R pixel in line of square
];
avgG += data[ y*width*3 // line in image
+ x*3 // pixel on line
+ dy*width*3 // line of square
+ dx*3 + 1 // G pixel in line of square
];
avgB += data[ y*width*3 // line in image
+ x*3 // pixel on line
+ dy*width*3 // line of square
+ dx*3 + 2 // B pixel in line of square
];
}
}
unsigned char avgRb= avgR/(dx*dy);
unsigned char avgGb= avgG/(dx*dy);
unsigned char avgBb= avgB/(dx*dy);
fwrite(&avgR,1,1,outputFile);
fwrite(&avgG,1,1,outputFile);
fwrite(&avgB,1,1,outputFile);
}
}
Это можно оптимизировать с помощью арифметики с указателями, но это показывает основы цикла, который вам необходим.
Примечания:
..&& y+dy<height
проверяет граничный случай, когда последний квадрат не соответствует высоте. То же самое для ширины.
, следовательно, среднее значение рассчитывается путем деления на (dx*dy)
.
Отказ
Я не мог проверить это, поэтому алгоритм - это умственная конструкция.