【问题标题】:Creating a 2D-Array to output a pmm file C++创建二维数组以输出 pmm 文件 C++
【发布时间】:2013-01-16 05:19:31
【问题描述】:

给我的指示非常模糊,我完全不知道我应该做什么。需要一些帮助。我会尽力解释,希望有人能帮助我。

当您使用值 col 设置像素 (i,j) 的颜色时,我需要生成一个指定宽度和高度的 ppm 文件,如下所示:

float col = float (((i & 0x08) == 0) ^ ((j & 0x08) == 0));

您可能希望对 RGB 颜色使用以下结构:

struct RGB {
    float r;
    float g;
    float b;
};

数组中的每个元素都在 [0.0, 1.0] 的范围内,并且必须在写入文件之前转换为 [0, 255]。

这与我所掌握的信息一样多。我真的只是迷失了他真正想让我做什么。对于更有经验的人来说,这可能是足够的信息,但对我来说却不是。有人可以详细说明一下。另外,第一个公式/代码 sn-p 到底是做什么的?

我仍然不知道 i 和 j 是什么或公式是什么,也不知道如何生成要写入 RGB 二维数组的值!?!?

【问题讨论】:

  • ij 是您要设置的像素的坐标。正如您所写:“*当您使用值 col 设置像素 (i,j) 的颜色时:float col = float (((i & 0x08) == 0) ^ ((j & 0x08) == 0));
  • 我现在感觉自己像个白痴,因为我已经完成了大部分设置和工作,感谢所有帮助人员。

标签: c++ arrays rgb ppm


【解决方案1】:

PPM 是非常简单的位图格式,您在问题中基本上已经描述了它。要查看更多详细信息,请谷歌或查看http://netpbm.sourceforge.net/doc/ppm.html

要将范围 [0.0 .. 1.0] 转换为 [0 .. 255],您只需为每个像素分量乘以 255.0。

总结一下:将 ppm 标头写入文件,遍历所有像素,将其分量乘以 255,转换为整数,以文本形式写入文件。文件中的所有值都用空格分隔。

第一个代码sn -p 告诉你如何生成图片。这基本上意味着如果 i 和 j 坐标的右数第四位不同,则颜色为白色,如果它们相同,则颜色为黑色。这应该会生成一个 16 x 16 方格的棋盘图案。

【讨论】:

    【解决方案2】:

    在第一个公式中,您将获得的不是 [0 1] 的 in range 值,而是 0s1s,因为 operator == 返回任一truefalse(0 或 1 位表示)。对 0 和/或 1 的 XOR ( ^ ) 操作也将返回 0 或 1。

    这是一个异或运算的真值表

    -----------------
    | a | b | a ^ b |
    -----------------
    | 0 | 0 |   0   |
    -----------------
    | 0 | 1 |   1   |
    -----------------
    | 1 | 0 |   1   |
    -----------------
    | 1 | 1 |   0   |
    -----------------
    

    从范围 [0 1] 到 [0 255] 的转换只是将值乘以 255。

    void convertTo_255( struct RGB * array, size_t count {
        for ( size_t i = 0; i < count; i++ ) {
            array[ i ].r *= 255;
            array[ i ].g *= 255;
            array[ i ].b *= 255;
        }
    

    【讨论】:

    • 是创建/生成 struct RGB 的数组并生成填充它的值让我感到困惑?当编译后无法设置数组的大小时,如何使用从命令行传入的维度创建数组。 i 和 j 的值是多少?
    猜你喜欢
    • 2012-11-07
    • 2010-09-26
    • 1970-01-01
    • 2019-03-18
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多