Gif 图像格式中如何合并透明度

Posted

技术标签:

【中文标题】Gif 图像格式中如何合并透明度【英文标题】:How is transparency incorporated in Gif Image format 【发布时间】:2019-11-28 09:28:48 【问题描述】:

GIF89a 通过将索引指定为透明图块来支持透明度。它只支持完全透明,这意味着不支持可变透明度(如 PNG 的情况)。

我尝试阅读Pseudo RFC 的 GIF89a 格式,它在整个文档中仅包含两次提及透明度。即:-

透明度标志 透明度指数

和上面两个的描述,不是最直观的。

GIF 的***页面指出,索引 = 16(在 256 调色板中)的透明图块始终指定为透明图块/索引。但随后它指出,“图像数据中出现的唯一颜色索引是十进制 40 和 255,全局颜色表分别映射到黑色和白色”,这让我相信我可能是误解了页面中可用的信息(正如我之前在图像中看到的 index 的像素值)。

问题:-

如何在.gif (89a) 图像中加入透明度?是一个 调色板中的常量索引总是被赋予透明值? 如果是,那么当图像没有时调色板是否保持不变? 透明区域,这是否意味着我们只能使用 255 个唯一的 索引(因为 1 索引总是给透明瓷砖)?

P.S.:-如果有人能补充一下透明度是如何包含的,我将不胜感激?是使用 Alpha 瓦片(如在 RGBA 或 LA 中)还是从该像素中移除颜色以使其透明?

【问题讨论】:

【参考方案1】:

如何在 .gif (89a) 图像中加入透明度?调色板中的常量索引是否总是被赋予透明值?

没有。

Transparency Flag TF 只是表示 Transparency Index TI 对框架是否有任何意义。

如果TF == true 则当前(全局或局部)调色板中的某个颜色索引在将当前帧与图像的其余部分组合时被视为透明。该索引存储在TI

如果是,那么当图像没有透明区域时,调色板是否保持不变,这是否意味着我们只能使用 255 个唯一索引(因为透明图块总是有 1 个索引)?

当图像没有透明区域时,TF == falseTI 的值通常是垃圾,因此它不会被 GIF 加载器解释。

作为一名自称 GIF 专家,我试图在文档和 this tiny loader 的源代码中尽可能简洁地记录 GIF 的内部工作原理。

[UPD:]

那么,这是否意味着仅当 .gif 文件具有框架时才包含透明度。这意味着它不是单个图像,而是一系列图像?

没有。即使是单帧 GIF 也允许包含 Graphics Control 标头,所以不能。

GIF 是否有 256 种颜色的固定调色板,这意味着调色板不能存储比该颜色范围更多/更少的颜色。正如你所提到的,我在问这个问题,在黑白图像中,只有两种颜色存在黑色和白色,那么调色板索引的其余部分会发生什么?或者像 GIF 格式如何管理较低的色彩空间?

GIF 支持 2 的幂且介于 2 和 256 之间的任意大小的调色板,结果为:2、4、8、16、32、64、128 或 256。

调色板大小由全局 GIF 标头中的bits 0 to 2 of the flags field 控制。

【讨论】:

那么,这是否意味着仅当 .gif 文件具有框架时才包含透明度。这意味着它不是单个图像,而是一系列图像? 其次,请您详细说明问题的这一行:- "图像数据中出现的唯一颜色索引是十进制的 40 和 255,全局颜色表映射到黑色和分别为白色" @VasuDeo.S 你能把那个 GIF 发给我,让我分析一下吗?完成后我会更新我的答案。 实际上我没有 gif。我从概念的角度问这个问题,只是为了知识。我想提高对 .png、.gif、.jpg 等图像格式的理解。 @VasuDeo.S 啊,我明白了。 GIF Wikipedia 讲述的是由一些早期版本的 MS Paint 生成的,无论如何它总是分配 256 色调色板,考虑到目标 GIF 只有两种颜色,这肯定是浪费空间。

以上是关于Gif 图像格式中如何合并透明度的主要内容,如果未能解决你的问题,请参考以下文章

Java支持的图像文件格式?

png文件是啥格式?

0024 Photoshop 切图

JPEG/PNG/GIF图片格式简析

简述jpggifpng-8png-24的区别,分别使用场景

简述jpg。Gif。png-8.png-24的区别,分别使用场景