可能发生的情况:屏幕截图是 16 位 png,但 illustrator 将其读取为 8 位 png,仅使用低 8 个 (!) 位。
解释
对于下面的解释我们假设截图是一个 16 位灰度图像,即每个像素都是一个介于
黑色= 0 = 0x0000 = 0b 0000 0000 0000 0000
和
(16 位)白色= 2^16-1 = 65535 = 0xFFFF = 0b 1111 1111 1111 1111。
(0x 表示十六进制数,0b 表示二进制数)
Illustrator 似乎只加载了这 16 位中的 8 位,不幸的是错误的位,即最不重要的位。选择最低有效位是唯一的问题。
0b #### #### #### ####
\_______/ \_______/
discarded loaded
导入后,illustrator 会根据新的最大数量缩放解释(哪个数字是白色的,哪个是黑色的):
(8 位)白色= 2^8-1 = 255 = 0xFF = 0xb 1111 1111。
假设我们的一个像素的值是 0b 1111 1111 0000 00001 = 0xFF01 = 65281,这几乎是白色的。导入后,值将是 0b 0000 0001 = 0x01 = 1,即接近黑色。
这就像将 999.1“四舍五入”为 1——完全错误!
模拟
我们如何确定所描述的问题是我们的问题?我们模拟错误!
以下 python 程序如上所述加载 16 位屏幕截图。
(请不要评判我,这是我的第一个 python 程序。)
#! /usr/bin/python
import numpy as np
import cv2
# load picture
img = cv2.imread('screen.png', 3)
# assert (by hand) that picture is loaded as 16 bit image
print img.dtype
# simulate the bug
img[:,:] &= 0x00FF # use only 8 least significant bits
img[:,:] <<= 8 # rescale
# save the picture
cv2.imwrite('bug.png',img)
结果bug.png
点击此处查看原始尺寸,此处与 OP 版本进行比较。
正如我们所看到的,我们的模拟产生了完全相同的结果。
解决方法
我只能想到一种解决方法(因为我不使用插画师):
将您的屏幕截图转换为 8 位 png
GraphicsMagick 和/或 ImageMagick 是适合这项工作的控制台工具。以下命令转换为 8 位 png:
convert original.png -depth 8 converted.png