# 白与夜 - 题目分类:general - 题目分值:100 这是一个关于白猫,嗯不对,关于黑猫的故事。 [打开/下载题目](./src/WhiteAndBlack.html) --- 这里是~~全场除签到题外最水的题的~~ writeup  ~~先吸一口猫~~ ## 解题方法 方法很多,你可以: 1. F12 然后发现  这里的 `white` 也是提示之一,只要改成 `black` 即可显现出 flag。这样的操作对于通过了签到题的玩家应该没什么难度。 1. 下载图片并在黑色背景下查看。 ## 图片生成 那么这张兼具黑白猫的图片是怎么生成的呢? 显而易见,在白色背景下看到的是白猫图,在黑色背景下看到的是黑猫图。能够产生这样的效果是因为在 PNG 文件中,每个像素都有 Alpha 通道值,在 0~1 之间(0 为完全透明,1 为不透明)。 设 A 为 Alpha 值,X 为图片像素点的灰度(0~1),则 白底时显示的灰度为:X<sub>1</sub> = A · X + (1 - A ) · 0 黑底时显示的灰度为:X<sub>2</sub> = A · X + (1 - A ) · 1 那么确定了 X<sub>1</sub> 和 X<sub>2</sub> 之后,可以解出 PNG 图片的 A 和 X: A = 1 + X<sub>1</sub> - X<sub>2</sub> X = X<sub>1</sub> / (1 + X<sub>1</sub> - X<sub>2</sub>) 其中若 1 + X<sub>1</sub> - X<sub>2</sub> = 0,也就是说 X<sub>1</sub> = 0,X<sub>2</sub> = 1,即白底显示白色,黑底显示黑色,此时 X 可取任意值,A 取 0。 为了让 A 取值在 0~1 之间,X<sub>1</sub> 需要小于 X<sub>2</sub>,这对选取的两张图片的灰度有要求,白底图应始终比黑底图亮。 刚刚讨论的是灰度图,但是很可惜 RGB 图片不能这样处理,因为 RGB 三个通道都可以这样算出一组 A 和 X。其中 A 不能保证相同,但 A 最终的取值只能有一个。 于是我准备了一张白猫图和一张黑猫图,其中黑猫图带有 flag。用 PhotoShop 将它们处理成**相同大小**的灰度图,然后运行 `run.py` 脚本生成新图。   ~~做题不会使你快乐,但是吸猫会(逃~~