【问题标题】:Why does GIF pixel values change when saved in python?为什么保存在 python 中的 GIF 像素值会发生变化?
【发布时间】:2018-12-30 18:21:13
【问题描述】:

我正在尝试使用 LSB 方法编写一个隐写术应用程序,到目前为止,它对于一些图像格式来说已经足够好了。

但是它不适用于 GIF 图像,因为我注意到保存的 gif 具有几个不同的像素值(通常为 +- 1),并且 LSB 方法依赖于更改最低有效位,因此一些不同的值会抛出解码算法关闭。

我尝试过同时使用 imageio 和 PIL.Image,但在这两种情况下都是同样的问题

所以基本上我的问题是:为什么像素值在保存时会发生变化,甚至可以使用 LSB 对 GIF 进行编码和解码?

感谢您的帮助。

【问题讨论】:

  • 你的 gif 有超过 255 种颜色吗?
  • 阅读here 了解有关各种图像格式的更多信息。 GIF 虽然是无损的,但最多只能支持 256 种颜色,而 256**3 = 16777216。
  • 我所做的是提取 gif 并使用修改后的第一帧复制它,提取的图像位于 RGB 像素数组中(我使用的示例有 (197,350,4) 作为尺寸)。所以是的,我猜它有超过 256 种颜色。但是为什么提取出来的图片有超过 256 种颜色呢?
  • 因为 GIF 是基于调色板的,所以改变一个像素的 LSB 可以完全改变显示的颜色。
  • 这就是我在更改 gif 代码后注意到的,现在我明白了原因。不过谢谢你的回答!!

标签: python python-imaging-library gif python-imageio


【解决方案1】:

Gif 是无损的,它不应该改变像素,我最近做了一个小应用,使用 gif 格式的 LSB 方法,这里是你应该做的几件事:

  • 确保在正确编码时,尝试替换像素(0,0),然后验证值是否发生变化,如果不是,请检查解码

  • 确保 gif 颜色为 255

  • 你以后会遇到这种情况,但是你应该把原始元数据和组装帧的延迟时间放在一起

这些是主要问题,除此之外,正如我之前所说,它是一种无损压缩,就像 png 一样,它不应该改变像素,所以问题在于编码/解码或 RGB 颜色的类型。

【讨论】:

  • 正如我在问题中所说,编码和解码代码很好,因为它适用于其他格式以及在保存之前解码相同的编码数据。问题是保存后检索的数据与我保存的数据不同。我现在明白这是因为 gif 像素保存在 8 位调色板中。然而,使用 imageio 读取 gif 会返回一个 rgb 数组列表(例如,有点像 png),这让我很失望
  • 是的。很高兴你解决了你的问题!如果这个答案有帮助,请竖起大拇指。
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
相关资源
最近更新 更多