我正在尝试构建一个ppm文件,它会给我这个标志的图像:
它是1200(列)乘600(行)图像,垂直红条的宽度是300列。我已经编写了代码并且编译得很好,但是当我尝试在Gimp中查看ppm文件时,它会抱怨:文件过早结束。我不知道发生了什么,因为我为两个先前的标志构建了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);
}
答案 0 :(得分: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);
}