Почему мое изображение из файла ppm немного отличается?

Задача состоит в том, чтобы создать изображение российского флага на изображении с 800 столбцами и 600 строками. Итак, флаг разделен на три равные части (белая сверху, синяя посередине и красная снизу).

Вот мой код:

#include <stdio.h>

int main() {
   printf("P6\n");
   printf("%d %d\n", 800, 600);
   printf("255\n");

   int width, heightWhite, heightBlue, heightRed, i, j;
   unsigned char Rcolor, Bcolor, Gcolor;

   width = 800;
   heightWhite = 200;
   heightBlue = 400;
   heightRed = 600;

   for (j = 0; j <= heightWhite; j++) {
      for (i = 0; i <= width; i++) {
         Rcolor = 255;
         Bcolor = 255;
         Gcolor = 255;

         printf("%c%c%c", Rcolor, Gcolor, Bcolor);
      }
   }

   for (j = 201; j <= heightBlue; j++) {
      for (i = 0; i <= width; i++) {
         Rcolor = 0;
         Bcolor = 255;
         Gcolor = 0;

         printf("%c%c%c", Rcolor, Gcolor, Bcolor);
      }
   }

   for (j = 401; j <= heightRed; j++) {
      for (i = 0; i <= width; i++) {
         Rcolor = 255;
         Bcolor = 0;
         Gcolor = 0;

         printf("%c%c%c", Rcolor, Gcolor, Bcolor);
      }
   }

   return (0);
}

Но когда я посмотрел на изображение, сгенерированное моей программой, я заметил, что верхние части синей и красной полос не полностью горизонтальны (похоже, что это часть строки, из-за которой верхние части синей и красной полос находятся выше, чем предыдущие пиксели) Я не могу понять, почему я получаю это. Я уже запускал ppm-файл моего инструктора в Gimp (это то, что я использую для просмотра ppm-файлов), и линии должны быть идеально ровными. Любые идеи?

(Я не знаю, как прикрепить файл ppm, но вот как он должен выглядеть: http://users.csc.calpoly.edu/~dekhtyar/101-Fall2013/labs/lab7.html) (это самый первый флаг)


c ppm
person Karen    schedule 29.10.2013    source источник


Ответы (1)


Вы печатаете еще один пиксель для каждой строки (последняя строка каждого цвета печатает на 200 пикселей больше).

Сдача

for (i = 0; i <= width; i++) {

to

for (i = 0; i < width; i++) {

ИЗМЕНИТЬ:

но почему я могу указать "‹=" для высоты?

for (j = 0; j < heightWhite; j++)  = 0...199 = 200 items
for (j = 1; j <= heightWhite; j++) = 1...200 = 200 items

Обратите внимание, что весь ваш код может быть выполнен с двумя циклами:

#include <stdio.h>

int main(void)
{
   int width = 800, height = 600, icolor = 0, i, j;
   unsigned char color[][3] = {
      {255, 255, 255}, /* white */
      {0, 0, 255},     /* blue */
      {255, 0, 0}      /* red */
   };

   printf("P6\n");
   printf("%d %d\n", width, height);
   printf("255\n");

   for (i = 0; i < height; i++) {
      for (j = 0; j < width; j++) {
         printf("%c%c%c", color[icolor][0], color[icolor][1], color[icolor][2]);
      }
      if (i && (i % 200 == 0)) icolor++; /* 200, 400, 600 */
   }
   return 0;
}
person David Ranieri    schedule 29.10.2013
comment
А, понятно! Просто любопытно, а как я могу сказать ‹= для высоты? Спасибо за помощь! - person Karen; 29.10.2013
comment
Я думаю, что ваш трюк с модулем слишком умный. Явное соблюдение разной ширины с тремя петлями для каждого цвета было бы IMO проще для понимания и работало бы с цветными пятнами разной ширины. - person shodanex; 29.10.2013
comment
Ну, так как все столбцы имеют одинаковую высоту, я не вижу проблем с использованием по модулю. - person David Ranieri; 29.10.2013
comment
Извините, ОП опубликовал аналогичный вопрос с вертикальными полосами. - person shodanex; 29.10.2013
comment
@shodanex, без проблем;) - person David Ranieri; 29.10.2013