我最近遇到了一张非常奇特的图片,它具有奇怪的属性。该图片为 PNG 格式,只显示了一只带有透明背景的简单鸟。我的朋友将图片发送给我,并附上简单的说明,让我保存它并将其设置为背景。
将图像设置为背景后,出现的第二张图像实际上显示海鸥站在武器上:
一开始,我对图像的性质以及如何制作这样的图像感到非常好奇。我在 Photoshop 中打开了图像,没有出现任何异常 - 图像仍然与透明海鸥相同,没有隐藏图层或使其不可见的蒙版。在 Photoshop 中检查图像后,我以为 Windows 在将其设置为我的桌面背景时对文件进行了更改 - 导航到%AppData%\Microsoft\Windows\Themes
图像后,发现图像似乎是一样的。
为什么将此图像设置为 Windows 桌面背景时,与在 Photoshop 中查看或编辑相比,会显示单独的隐藏图层或完全单独的图像?
答案1
我猜这就是所谓的“肮脏的透明度”文章来自 Smashing Magazine。
基本上,透明 PNG 中的任何颜色都可以用 RGBA 值来描述,其中 RGB 代表红色、绿色和蓝色通道,A 代表 Alpha。“不可见”颜色可以具有任何 RGB 值 + 0 Alpha,这意味着颜色将保留原始信息,但由于其 Alpha 设置为 0,因此呈现为透明。
为什么要在使用 Alpha 时存储 RGB 值?这样您就可以获得平滑的边缘和透明的颜色——与透明背景 GIF 中的锯齿状边缘不同。PNG 中的透明度可以从 0 到 255,在 GIF 中则是 100% 透明或不透明。要以 50% 的透明度渲染某些内容,您仍然需要知道 RGB 值,因此会存储该值。大多数图像编辑软件(包括 Photoshop)在保存完全透明的颜色时都会丢弃该 RGB 信息。
我不能代表 CC 版本发言,但要看到旧版 Photoshop 中“不可见”的颜色,您需要一个插件。选择一个:免费照片或者超级 PNG。SuperPNG 看起来更新,而且更简洁。
为什么这个技巧有效?壁纸必须是不透明的,因为它们“后面”没有东西可以显示出来,对吧?我猜是 Windows 丢弃了 Alpha 通道信息,从而揭示了隐藏的 RGB 值。
答案2
添加到Nihal 的回答,这可以通过使用 GIMP 中的“反擦除”画笔来重现。如果图像使用的格式支持 alpha 通道,则“擦除”画笔可以添加或删除 alpha 通道(按住 Alt 可在擦除和反擦除之间切换)。
对于 Krita,您可以这样做: Layer > Split Alpha > Alpha into Mask
。完成后,您可以隐藏或删除刚刚创建的透明度蒙版 1 通道,然后您将看到完整的图像。
由于 Windows 背景后面不能有任何东西,因此它可能只是剥离透明度并显示没有透明度的图像(从外观上看,快速而粗糙的 32 位图像转换为 24 位)。
答案3
需要澄清的一点是:这不是错误,而是 png 规范中指定的行为。具体来说,规范指出,如果查看器或转换器无法理解透明度,或者透明度不适合上下文或使用,则可以忽略 alpha 通道。此外,规范要求所有图像生成器设置透明颜色,以便在忽略 alpha 通道时图像仍然有用。(我的解释是,我读这个规范已经有几年了。)
答案4
我在 Adobe After Effects 中尝试导出带有 alpha 通道的视频时遇到了这个问题。它会坚持将隐藏背景导出为任何具有透明度的视频格式,包括 ProRes 4444 alpha、带有 alpha 的动画编解码器和 .png 序列。隐藏的背景在时间线预览中不可见,但我在 After Effects 中找不到任何方法来阻止它出现在导出的视频中。
正如前面所建议的,SuperPNG(Photoshop 的文件格式插件)是一种从单个 .png 文件中删除隐藏背景的简单方法。但是对于大量 PNG 文件(PNG 序列),这是不可行的。
要在 Photoshop 中查看隐藏的背景,请单击“图层”/“图层蒙版”/“透明度”。现在查看“图层”窗格。隐藏的背景就在那里,您可以通过删除蒙版使其在编辑器区域中可见。
您可以使用图像魔术师删除隐藏的背景。您可以对一个文件或批量处理多个文件执行此操作。在 Windows 命令行上,您可以执行以下操作来处理 *.png(非常慢,但至少有效):
for %f in (*.png) do C:\ImageMagick\convert.exe -alpha on -background none -flatten "%f" "fixed_%f.png"