【问题标题】:Why is my image from my ppm file a little off?为什么我的 ppm 文件中的图像有点偏离?
【发布时间】:2013-10-29 06:30:55
【问题描述】:

任务是在具有 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);
}

但是当我查看我的程序生成的图像时,我注意到蓝色和红色条的顶部不是完全水平的(它看起来像使蓝色和红色条顶部的行的一部分是比前面的像素高)我不知道为什么我会得到这个。我已经在 Gimp 上运行了我的讲师的 ppm 文件(这是我用来查看 ppm 文件的文件),并且这些行应该是完全水平的。有任何想法吗?

(我不确定如何附加我的 ppm 文件,但它应该是这样的:http://users.csc.calpoly.edu/~dekhtyar/101-Fall2013/labs/lab7.html)(这是第一个标志)

【问题讨论】:

    标签: c ppm


    【解决方案1】:

    每行多打印一个像素(每种颜色的最后一行多打印 200 个像素)。

    改变

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

    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;
    }
    

    【讨论】:

    • 啊,我明白了!只是好奇,但我怎么能说“
    • 我认为你的取模技巧有点太聪明了。明确地尊重每种颜色的三个循环的不同宽度将 IMO 更容易理解,并且可以使用不同宽度的色块。
    • 好吧,由于所有条形的高度相同,我认为使用模数没有问题。
    • 抱歉,OP 用竖线发布了一个类似的问题
    • @shodanex,没问题 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    相关资源
    最近更新 更多