【问题标题】:How to determine the number of transparent pixels in an animated GIF frame?如何确定动画 GIF 帧中透明像素的数量?
【发布时间】:2021-03-17 08:55:25
【问题描述】:

我知道动画 GIF 帧中的透明像素由透明颜色索引决定,当透明颜色标志设置为1.

但是,我不知道如何确定动画 GIF 帧的透明颜色索引是什么,是否设置了透明颜色标志,以及如何确定帧中的哪些像素是这种颜色。我查看了诸如ImageMagickwandPillow 之类的工具,但我无法制定解决方案来找到透明像素的数量。

我想用一些伪代码(Python 风格)来制定我的解决方案:

def count_transparent(frame):
    count = 0
    if transparent_flag(frame):
        transparent_pixel = find_transparent_pixel(frame)
        for row in frame:
            for col in frame:
                # Compare the colors
                if frame[row][col] == transparent_pixel:
                    count += 1
    return count

问题

我可以使用哪些工具/方法(以及如何使用它们)来获取信息以查找与每个动画 GIF 帧的透明颜色标志和透明像素有关的信息,我还可以在其中迭代每个位置一个框架?

我找到的最接近的是gifsicle,它似乎可以让我找到有关透明颜色标志和透明像素的信息,但我无法用它遍历帧的每个位置。我很欣赏我可以与 Python 一起使用的东西,尽管也欢迎任何语言的解决方案。

【问题讨论】:

  • PIL Images 有一个 info 字典,其中包含取决于格式的各种信息。在查看了用于处理 GIF 文件的 source code 之后,看起来这本字典中的一个键是 info["transparency"] — 所以看起来您需要的信息可能可用。
  • 请问你到底想做什么?您是否有一个示例 GIF,其中您知道您要寻找的透明像素的数量?如果有,请分享一下?您是在处理 GIF 动画还是普通的单帧图像?
  • 您知道动画 GIF 的帧不一定覆盖整个图像区域吗?一个框架有时只适用于和更新比整个画布更小的区域,所以您是否认为更新区域之外的像素是透明的,因为它们看不到?
  • @martineau 酷,我会看看info 字典,看看我能从中得到什么。
  • @MarkSetchell 任何 GIF 都可以工作(我没有知道透明像素数量的示例)。我特别选择了 GIF,因为我正在尝试研究您指出的技术的应用频率,我们对帧的较小区域执行更新以优化空间。

标签: python image-processing imagemagick gif animated-gif


【解决方案1】:

在 ImageMagick 中,您可以通过提取 Alpha 通道来确定透明像素的数量,将其取反以使透明为白色,然后获得该图像的平均值(在 0 到 1 范围内)乘以宽度*高度。第10帧(从0开始)

convert image.gif[9] -alpha extract -negate -format "%[fx:mean*w*h]" info:

应该给你透明像素的数量。

【讨论】:

  • 太棒了,这正是我所需要的。作为一个后续问题,是否可以确定 GIF 帧的调色板中的哪个索引(无论是本地的还是全局的)是定义透明度像素的索引?
  • 对不起,我不知道那个答案。 identify -verbose 报告透明颜色。但我不确定这是否是你要找的?
  • 这就是我正在寻找的东西,尽管我可能需要找到一种方法来单独报告透明颜色。感谢您的帮助!
猜你喜欢
  • 2011-12-23
  • 2015-12-21
  • 1970-01-01
  • 2014-06-10
  • 2020-04-30
  • 2012-06-12
  • 2021-03-29
  • 2023-03-03
  • 2021-03-19
相关资源
最近更新 更多