我目前正在开发一个 iOS 应用程序,并且正在尝试对其标准警报对话框窗口进行逆向工程。我已经设法通过对纯黑色视图和纯白色视图进行一些颜色采样来弄清楚它使用的背景上的 alpha 值是多少。
鉴于此信息,使用 GIMP 是否可以仅“擦除”背景颜色,以便我只剩下原始的、未混合的警报背景?
我只有图像形式的警报视图作为正在运行的应用程序的屏幕截图。
我目前正在开发一个 iOS 应用程序,并且正在尝试对其标准警报对话框窗口进行逆向工程。我已经设法通过对纯黑色视图和纯白色视图进行一些颜色采样来弄清楚它使用的背景上的 alpha 值是多少。
鉴于此信息,使用 GIMP 是否可以仅“擦除”背景颜色,以便我只剩下原始的、未混合的警报背景?
我只有图像形式的警报视图作为正在运行的应用程序的屏幕截图。
是的,这是可能的。让我以Wikimedia Commons 中的这张图片(由ed_g2s授权为CC-By-SA 3.0)为例概述它是如何完成的:
将黑白背景版本作为同一图像的图层打开(使用Open as Layers ...或仅打开两者并将一个复制并粘贴到另一个)。如果不是这样,将白色层移动到黑色层上方。这两层应该是这样的:
获取图层的差异:克隆黑色图层(稍后您将需要它),将白色图层的图层模式更改为“差异”并将其合并。反转结果。这为您提供了原始图像的 Alpha 通道。
编辑:如果您的背景不是黑色和白色,则倒置差异层不会有黑色背景。要解决这个问题,首先对图层进行去饱和处理(使用能够提供最佳对比度的任何模式),然后使用颜色→自动→标准化使背景变黑。您也可以改用Channel Mixer,但使用起来有点棘手。
(如果您正在重新创建的 Alpha 通道至少有一些不透明度为 100% 的部分,则上述规范化有效;如果您正在重新创建的图像到处都是半透明的,您可以使用颜色 → 色阶...改为仅设置黑点。 )
如果您还没有,您还需要为下一步创建一个带有黑色背景的图像版本。为此,请使用以下额外步骤:
如果我们使用带有预乘 alpha 的图像格式,我们现在或多或少地完成了。但既然我们不是,我们仍然需要对 RGB 通道进行去乘。为此,克隆我们在上一步中创建的 alpha 图层(或将其复制到剪贴板),将其图层模式设置为“分割”并将其与您在步骤 2 之前克隆的黑色背景图层合并。结果应该看起来像这样(与原始的黑色背景版本比较以查看差异):
现在,将图层蒙版添加到生成的图层,选择蒙版并将 Alpha 图层粘贴到其中。结果现在应该看起来或多或少像原始透明图像。最后,要将蒙版转换为正确的 Alpha 通道,您可以应用它(但即使您不这样做,GIMP 的 PNG 导出也会为您执行此操作)。你去 - 一个重建的透明PNG准备好了:
当然,这种技术确实需要您拥有纯黑色和纯白色背景上的图像版本。如果背景有点偏离,类似的方法可能仍然可用,但您可能需要进行额外的颜色调整,结果可能不会那么完美。(编辑:请参阅上面第 2 步的补充内容。修改后的说明应该适用于任何颜色的背景,只要它们是纯色。)
附言。GIMP 还具有“颜色擦除”功能(作为桶填充工具的混合模式,或作为整个图像的颜色到 Alpha... ),当您只有一个图像版本时,这对于重建透明度很有用在纯色背景上。但是,除非小心使用,否则它确实倾向于产生比您可能希望的更透明的输出。
pps。如果您非常仔细地比较原始图像和重建图像,您会发现它们并不完全相同——一些颜色值相差 1/256 左右。这是因为 GIMP 的“除法”层模式是如何工作的:它实际上计算的是output = ( 256 × input ) / ( layer+ 1)。这种不匹配表面上是为了避免除以零,这意味着某些颜色可能会舍入到与应有的值略有不同的值。唉,除了修补 GIMP、编写一个插件来按照我们想要的方式进行划分或使用其他程序之外,我不知道有什么办法。不过,幸运的是,人眼几乎无法真正感知到色差。