0

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

当您使用值 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]。

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

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

4

2 回答 2

1

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

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

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

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

于 2013-01-16T05:59:14.017 回答
0

在第一个公式中,您将不会得到[0 1]范围内的值,而只会得到 0sand 1s,因为 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;
    }
于 2013-01-16T05:57:48.357 回答