如何确定动画 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 一起使用的东西,尽管也欢迎任何语言的解决方案。
【问题讨论】:
PILImage
s 有一个 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 帧中透明像素的数量?的主要内容,如果未能解决你的问题,请参考以下文章