【问题标题】:Get X/Y position of pixel in PNG file获取PNG文件中像素的X/Y位置
【发布时间】:2020-02-12 07:47:36
【问题描述】:

在去除标题字节并解压缩像素值后,PNG 文件为我们留下了一组行(图像的一个像素高的水平条)。

每一行都以一个字节开始,指定使用的过滤器,然后是 RGB 值:

+-----+-----+-----+-----+-----+-----+-----+
| 0:F | 1:R | 2:G | 3:B | 4:R | 5:G | 6:B |    // end of first row in image
+-----+-----+-----+-----+-----+-----+-----+
| 7:F | 8:R | 9:G |10:B |11:R |12:G |13:B |    // end of second row
+-----+-----+-----+-----+-----+-----+-----+

在没有过滤字节的图像中,我可以将索引除以 3(因为每个 RGB 像素有三个值),然后使用这些公式来获得该像素的 x/y 位置:

x = index % width
y = index / width

但是过滤器字节让我失望!给定红色像素的字节索引,如何获得像素的 x/y 位置? (比如在第 4 字节或第 11 字节,如上所示。)

我尝试了各种排列方式,但我认为一定有一个优雅的解决方案!

【问题讨论】:

  • 您必须根据过滤器处理每一行,但完成后您可以将其丢弃。
  • @usr2564301 - 是的,但我仍然需要一种方法来了解特定像素在图像中的位置。我可以在图像解码时继续计数,但我想知道任意像素的 x/y 位置
  • 我本来打算用很长的答案解释 stride,但您似乎只漏掉了一件事。 除以 3 之前,从该起始值中减去 1。就这些了。
  • @usr2564301 – 我觉得我以前尝试过,但可能做得不对。那不会丢掉x坐标吗?我对 stride 一无所知,所以我欢迎更多信息!
  • 谢谢@usr2564301 - 我在这方面做了更多工作,我认为你是正确的。我将此作为答案发布在下面,但如果您能验证这对您来说是否合适,那就太好了?

标签: image png pixel


【解决方案1】:

基于 @usr2564301 的 cmets,我认为这可以正常工作:

y = ((index-1) / 3) / width
x = ((index-y) / 3) % width

其中width 是图像的宽度(以像素为单位),而不是字节行的宽度。

我们从index 中减去y,因为每一行都有一个过滤器字节,我们需要将它们全部删除以获得x 位置。

或者,y 可以使用以下公式计算:

y = index / row_width

其中row_width 是每行的字节数:三个用于RGB,一个过滤器字节乘以图像的宽度。

【讨论】:

  • 是的。但除非您仍然需要该过滤器(例如重新压缩图像),否则您最好永远不要将其保存在像素流中。
  • 嗯,其实我觉得这不对。几行之后,过滤器字节开始累加并产生错误。
  • 我明白了!对于x,我们必须从索引中减去y 而不是1
  • 啊哈——你的所有像素(和过滤器)都在一个连续的流中。是的,这是有道理的(您仍然必须为第一个过滤器字节减去 1)。我仍然强烈建议采用更结构化的方法:行列表,每行仅包含 RGB 像素数据。
  • 是的,我正在做一些非常奇怪的事情,需要这样做——感谢帮助!
猜你喜欢
  • 2022-08-02
  • 1970-01-01
  • 2014-02-22
  • 2021-05-15
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 2019-08-06
  • 2013-10-12
相关资源
最近更新 更多