如何确定动画 GIF 帧中透明像素的数量?

Posted

技术标签:

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

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

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

我想用一些伪代码(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,因为我正在尝试研究您指出的技术的应用频率,我们对帧的较小区域执行更新以优化空间。 【参考方案1】:

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

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

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

【讨论】:

太棒了,这正是我所需要的。作为一个后续问题,是否可以确定 GIF 帧的调色板中的哪个索引(无论是本地的还是全局的)是定义透明度像素的索引? 对不起,我不知道那个答案。 identify -verbose 报告透明颜色。但我不确定这是否是你要找的? 这就是我正在寻找的东西,尽管我可能需要找到一种方法来单独报告透明颜色。感谢您的帮助!

以上是关于如何确定动画 GIF 帧中透明像素的数量?的主要内容,如果未能解决你的问题,请参考以下文章

将裁剪蒙版应用于具有透明背景的动画 gif

gifjpegpng的区别

Tkinter GIF 动画步履蹒跚并且像素化

使用jquery从现有位置添加或减去一定数量的像素

为什么通常在发送数据埋点请求的时候使用的是 1x1 像素的透明 gif 图片?

e661. 确定图像中是否有透明像素