这里是全场除签到题外最水的题的 writeup
先吸一口猫
方法很多,你可以:
那么这张兼具黑白猫的图片是怎么生成的呢?
显而易见,在白色背景下看到的是白猫图,在黑色背景下看到的是黑猫图。能够产生这样的效果是因为在 PNG 文件中,每个像素都有 Alpha 通道值,在 0~1 之间(0 为完全透明,1 为不透明)。
设 A 为 Alpha 值,X 为图片像素点的灰度(0~1),则
白底时显示的灰度为:X1 = A · X + (1 - A ) · 0
黑底时显示的灰度为:X2 = A · X + (1 - A ) · 1
那么确定了 X1 和 X2 之后,可以解出 PNG 图片的 A 和 X:
A = 1 + X1 - X2
X = X1 / (1 + X1 - X2)
其中若 1 + X1 - X2 = 0,也就是说 X1 = 0,X2 = 1,即白底显示白色,黑底显示黑色,此时 X 可取任意值,A 取 0。
为了让 A 取值在 0~1 之间,X1 需要小于 X2,这对选取的两张图片的灰度有要求,白底图应始终比黑底图亮。
刚刚讨论的是灰度图,但是很可惜 RGB 图片不能这样处理,因为 RGB 三个通道都可以这样算出一组 A 和 X。其中 A 不能保证相同,但 A 最终的取值只能有一个。
于是我准备了一张白猫图和一张黑猫图,其中黑猫图带有 flag。用 PhotoShop 将它们处理成相同大小的灰度图,然后运行 run.py
脚本生成新图。
做题不会使你快乐,但是吸猫会(逃