【问题标题】:C++ RGB values from pixel selected by user-using seekg来自用户使用 seekg 选择的像素的 C++ RGB 值
【发布时间】:2011-10-11 21:52:43
【问题描述】:

我需要创建一个加载 .raw 图像(通用 100x100 图像)的程序,要求用户选择范围内的 (x, y) 坐标,并显示所述像素的红色、绿色和蓝色值使用 seekg 函数。我不知道如何从像素中获取 rgb 值。到目前为止,我已经阅读了教科书的每一章,并且没有任何关于检索 rgb 值的内容。

询问坐标并在超出范围时给出错误消息的代码工作正常。只有当我尝试提出使用 seekg/获取 rgb 值的代码时,我才会遇到麻烦。我查看了网站上的不同问题,这里有很好的信息,但我没有看到任何使用 seekg 来获取 rgb 值的答案。

我不是在寻找任何人为我编写代码,只是在寻找一些指导和朝着正确的方向前进。

loc = (y * 100 + x) * 3;  // code given by professor with 100 being the width of the image
imageRaw.seekg(loc, ios::beg);

然后我就不知所措了。

任何帮助将不胜感激。

【问题讨论】:

  • 似乎在执行 seekg( ) 之后,文件读取指针位于 3 的第一个字节,当它们合在一起时,会给出像素的颜色。接下来你可能会做什么?
  • 这就是我迷路的地方。我现在感觉真的很傻。这不是一项艰巨的任务,我知道这一点,但有些事情不适合我。

标签: c++ rgb seekg


【解决方案1】:

从那里,您可能需要读取三个字节,它们代表红色、绿色和蓝色值。您没有告诉我们足够的信息来确定订单;绿色几乎总是在中间,但 RGB 和 BGR 都相当常见。

从实际的角度来看,对于这种大小的图片,您通常根本不想使用 seekg。您将整个图像读入内存,并在存储数据的向量(或数组,如果您坚持的话)中查找值。

【讨论】:

  • 我想扩展这个答案,说你需要提高你的图像的位深度。您的高级值可能不是一个字节(8 位颜色)图片的范围可以从 2 位到 32 位颜色,所以您也需要考虑到这一点。
  • …我想如果你只检查一个像素,将图像带入内存是没有意义的。但是,如果您要对图像进行任何实际操作,则将其带入内存(在向量/数组中,或者,如果您在 Unix 上,可能通过mmap
  • @Shadow:从问题中的公式可以看出,它是 3 个字节/像素。注意其中的* 3。但你所说的当然是普遍的。 (我想这里可能是真的,没有什么说 24 位必须在三个通道之间平均分布。或者它们甚至必须是 RGB 值,YUV,HSV 等也是可能的。但那将是一个邪恶教授。)
  • @derobert 我同意,我很高兴这个问题没有比它需要的更难。这是现实生活中的典型情况。
猜你喜欢
  • 2011-04-21
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 2022-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多