【问题标题】:PPM wrong color displayPPM 错误颜色显示
【发布时间】:2020-05-27 15:31:55
【问题描述】:

显示 PPM 时得到奇怪的结果:

pixeldisplay

(这实际上是一个放大的 PNG)

文件如下所示:

textdisplay

尺寸很好(10 行,8 列),只是颜色不对(或者我错了吗?)。

正如文件第 3 行所述,我想为每个通道使用 0 到 255 之间的值。使用通常的 rgb 颜色空间,例如 (255, 255, 255) 用于白色, (0, 0, 0) 用于黑色, (255, 0, 0) 用于红色等等。但是图像中的那些颜色显然与文件中的不同。

乍一看,图像似乎变暗了。

我误解了格式吗?文件不是这样解释的吗?

【问题讨论】:

  • 请发布实际数据,而不是图片。毕竟只是 ASCII 文本。
  • 您使用什么软件从数据中制作图像?
  • 感谢您到目前为止的回答。 @Mark Setchell,“实际数据”是什么意思,第二个文件是我在非图像编辑器中打开它时看到的?
  • @Mark Setchell:图片是使用 Krita 制作的,但在 Gimp 或 ImageGlass 中看起来是一样的。
  • 这是一个 PNG 图像,而不是文本文件。尝试将 PNG 文件放入文本编辑器并选择 255。你不能,因为它是像素而不是数字。

标签: c++ file-format color-space ppm color-depth


【解决方案1】:

本文档:http://netpbm.sourceforge.net/doc/ppm.html 描述了 PPM 图像格式。

当在文件开头找到“神奇”值P6 时,像素的颜色将存储为二进制数据。引用前面提到的文件(强调我的):

[...] 高度行的栅格,按从上到下的顺序排列。每行由宽度像素组成,从左到右的顺序。每个像素按顺序是红色、绿色和蓝色样本的三元组。 每个样本都用 1 或 2 个字节以纯二进制形式表示。如果 Maxval 小于 256,则为 1 个字节。否则,它是 2 个字节。最重要的字节是第一个。

提问者显示的文件似乎包含他们的十进制文本表示。

所以,字符串"\n224 93 229..."(是的,我怀疑windows 的endline 序列"\r\n")被解释为(假设文件以ASCII 格式保存){10, 50, 50}, {50, 32, 32}, {57, 51, 32}, ...

注意中间的黑色像素,可能对应第一行的末尾,可能是{13, 10, 32}"\r\n ")。

如果您将魔法值更改为P3,它应该被正确解释。

【讨论】:

  • 谢谢,解决了。为了完整起见,我尝试了一下让 P6 二进制版本也能正常工作。我有颜色,但从来没有我期望的颜色。二进制版本中的颜色会是什么样子?
  • @Rbt 你是怎么写这些文件的?你在用write吗?
  • 不完全是,我使用了 std::ofstream 和:file
  • @Rbt 如果您正在执行单个调用以将单个大字符串写入文件,则表示此字符串中颜色值的数字不应格式化为文本(例如“200 128 04” ),但您必须输入实际值(例如 str[i] = 200; str[i + 1]= 128...)。
猜你喜欢
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多