Защо Gimp се оплаква от преждевременен край на файла?

Опитвам се да създам ppm файл, който ще ми даде изображението на този флаг:

въведете описание на изображението тук

Това е изображение с размери 1200 (колони) на 600 (редове), а ширината на вертикалната червена лента е 300 колони. Вече написах кода и той се компилира добре, но когато се опитам да видя ppm файла в Gimp, той се оплаква с: Преждевременен край на файла. Не знам какво се случва, защото създадох ppm файловете за два предишни флага с абсолютно същия формат (само различни for цикли) и те бяха показани от 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