【问题标题】:Determing the color of uncovered GIF pixels确定未覆盖的 GIF 像素的颜色
【发布时间】:2021-09-05 14:14:44
【问题描述】:

这是一个 GIF,仅包含一个 75 像素宽的图像。

图像有一个图像描述符,图像左侧位置为 25。

所以图像最左边的 25 个像素没有被覆盖。由于GIF specification 声明

背景颜色是用于屏幕上未被图像覆盖的像素的颜色。

背景颜色索引为 0,调色板中的第一个条目是 (0, 255, 0),我认为最左边的 25 个像素应该是绿色的。

相反,浏览器将这些像素呈现为透明的。

谁能告诉我这是为什么?我是否遗漏了规范中的某些内容?

【问题讨论】:

  • 像素被编码为调色板中的索引,并且一个条目被指定为“透明”(不被图像覆盖),这就是浏览器以这种方式呈现它的原因。原则上,没有什么能阻止调色板中的一个条目与其他条目具有相同的颜色,只是它位于不同的索引处。所以我猜测绿色条引用了一个恰好具有相同颜色的不同条目。现在,我不完全确定为什么透明索引有与之关联的颜色,但我怀疑它与 Disposal Method 标志以及动画 gif 如何清除框架有关。
  • '"transparent"(未包含在图像中)' - 我阅读规范的方式,它是图像外部时使用的背景颜色。如果您可以向我解释为什么使用透明度而不是背景颜色,那将回答我的问题。
  • 啊,我想我误解了,对不起。根据this answer 的说法:“背景颜色在很大程度上是GIF87a 的遗弃,目前仅在‘恢复背景’帧混合模式下需要”。它继续说:“我见过的所有解码器都将不属于任何帧的像素视为透明,即使所有帧中的透明度标志都归零” - 所以你在这里遇到的可能是非官方的但被普遍接受行为。
  • 感谢您的帮助

标签: gif specifications


【解决方案1】:

我已经找到https://legacy.imagemagick.org/Usage/anim_basics/#dispose。在讨论为什么 ImageMagick 使用透明度处理方法 2 时,它指出(强调我的)

有人认为,与其将覆盖区域清除为透明颜色,不如将其清除为存储在 GIF 动画中的“背景”颜色元数据设置。事实上,旧的“Netscape”浏览器(第 2 版和第 3 版)正是这样做的。但随后它也未能正确实现 'Previous' dispose 方法。

另一方面,初始画布也应该从格式“背景”颜色设置,但也没有这样做。然而,所有现代网络浏览器只清除最后覆盖的区域透明度,因此这是现在公认的做法,以及 IM 现在遵循的做法。

【讨论】:

    猜你喜欢
    • 2019-11-03
    • 1970-01-01
    • 2017-09-20
    • 2017-06-02
    • 1970-01-01
    • 2015-01-06
    • 2014-08-02
    • 2019-08-26
    • 2017-01-23
    相关资源
    最近更新 更多