Почему Gimp жалуется на преждевременный конец файла?

Я пытаюсь создать файл ppm, который даст мне изображение этого флага:

введите здесь описание изображения

Это изображение размером 1200 (столбцов) на 600 (строк), а ширина вертикальной красной полосы составляет 300 столбцов. Я уже написал код, и он скомпилировался нормально, но когда я пытаюсь просмотреть файл ppm в Gimp, он жалуется: Преждевременный конец файла. Я не знаю, что происходит, потому что я создал файлы ppm для двух предыдущих флагов с точно таким же форматом (только разные для циклов), и они были отображены Gimp (хотя у меня были некоторые проблемы, мне пришлось перезапустить Gimp несколько раз ).

Вот мой код для этого флага:

#include <stdio.h>

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

   int widthGreen, widthWhite, widthBlack, widthVertical, width, height, i, j;
   unsigned char Rcolor, Bcolor, Gcolor;

   widthGreen = 200;
   widthWhite = 400;
   widthBlack = 600;
   widthVertical = 300;
   width = 1200;
   height = 600;

   for (j = 0; j < height; j++) {
      for (i = 0; i < widthVertical ; i++) {
         Rcolor = 255;
         Gcolor = 0;
         Bcolor = 0;

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

   for (j = 0; j < widthGreen; j++) {
      for (i = 400; i < width; i++) {
         Rcolor = 0;
         Gcolor = 128;
         Bcolor = 0;

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

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

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

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

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

   return (0);
}

person Karen    schedule 29.10.2013    source источник
comment
У вас все та же проблема, что и в предыдущем вопросе. Вы не можете рассматривать ширину и высоту как простые счетчики, вы должны рассматривать их и каждую точку как пиксели изображения. Плюс другие проблемы, которые я указал в своем (принятом?) ответе на ваш предыдущий вопрос.   -  person Some programmer dude    schedule 29.10.2013
comment
О, подождите, но я не могу поставить все под одинаковые петли for, хотя они все имеют разную высоту :( И вертикальная полоса имеет другую ширину, чем три горизонтальные полосы. :(   -  person Karen    schedule 29.10.2013


Ответы (1)


Само конечное изображение по-прежнему имеет ту же высоту. Итак, выполните цикл по высоте и в этом цикле запишите одну строку пикселей. Для красной части все просто, так как это полная высота. Для других цветов вы должны проверить текущую высоту и соответствующим образом изменить цвет.

Что-то вроде следующего (псевдокод):

for (h = 0; h < height; ++h)
{
    write_color(300, red);

    if (h < 200)
        color = green;
    else if (h < 400)
        color = white;
    else
        color = black;

    write_color(900, color);
}
person Some programmer dude    schedule 29.10.2013
comment
Ах, хорошо! Большое спасибо! - person Karen; 30.10.2013