ps导出png设置探究 和 qq查看png颜色不一致 问题

起因

在测试gamma矫正的时候出现一件很有意思的事情,我用ps在线性空间下(颜色管理里设置了灰度系数为1)制作了两张色值为128的图片(对应sRGB空间下的188,后文如果没有特殊说明提到的色值均指代sRGB空间下的颜色,也就是ps默认设置或者dom的colorpicker对应的颜色),一张偏暗一点的图是导出设置不勾选srgb,不嵌入颜色空间的导出图。 另一张偏亮一点的图同样是线性空间下,导出设置不勾选srgb,但是勾选了嵌入颜色空间的导出图。(图片放在末尾github链接里,分别是aaanosrgb32embbed.png和aaanosrgb32noembbed.png)
对于这两张图片,windows照片查看能看出区别,发到qq聊天框里也是,但是发出去后的缩略图,不同设备看到的结果就不一样了。

  • 我的电脑上,聊天框里是原图,发出去后下面那张理论上应该要更亮一些
    自己的电脑

  • 华为p30pro上
    在这里插入图片描述

  • 红米k70上,本应偏亮一点的图会偏绿
    在这里插入图片描述
    尽管预览图不同的设备看到的不太一样,但是只要双击查看原图后是能看到正确的效果的。

验证

拿libpng测试了一下图片,发现无论怎么设置都无法读取gAMA块的值和sRGB块的值(即使写入了gAMA块数据),好在能读取像素值。可以发现两张图片的存储的像素值都是128,只不过嵌入了颜色空间的图片多了iCCP数据块(查看二进制可以看到)。因此可以推论,qq的预览图不支持解析iccp(也有可能是受显示设备影响或者两者皆有之,我没有肯定的证据),所以图片被当作sRGB空间处理了(128的值在sRGB空间下就是比较暗,相当于线性空间下的55,也就是我自己电脑上看到的结果,两张图颜色是完全一样的),而windows照片或者双击看原图的照片查看器都是能正确解析iccp的。
根据这个推论,要想qq预览图显示正确,我们只要不嵌入线性颜色空间信息就行了。那么就得提前设置转为srgb,将存储的值直接gamma矫正(线性空间下的128->存储成188->显示器显示sRGB的188->物理中灰色)。
如果不勾选sRGB也不嵌入颜色空间,那么你在线性空间下设置的128,他其实和sRGB工作空间下的128导出的图片无论怎么看都是sRGB下的128的颜色的(我仓库里的aaanosrgb32noembbed.png和bbbnosrgb32noembbed.png),他们在数据上既没有iCCP块也没有gAMA块,仅仅在iDAT上有区别(这要探究原因的话就只能自己解析iDAT了,用libpng读颜色显示是一样的因为sRGB的0.5和线性空间的0.5还是有很小偏差的,qq聊天窗和mac/win自带的预览/图片查看器如果解析不到iCCP颜色空间信息和gAMA块(gAMA块这个有待验证)就会当作sRGB空间解析(下一章有验证过程),从0-1映射到0-255整数值的时候这种偏差就看不出来了)

其他

1.ps仅在勾选转为sRGB和嵌入颜色配置文件的情况下(无论是否勾选导出为8位)写入gAMA数据块,可以看到导出后的图片可以看到gAMA值是45445。而上文我制作的两张图,因为都没有勾选sRGB,所以ps并没有写入gAMA块信息,这其实是不符合png规范(ps表示我用的广那么我就是规范)的。还有ps的预览图的效果是不对的,这里是我在线性空间下的128的颜色,但是预览图显示的是223,所以一切效果以导出后为准
2.“转为srgb”的意思是将像素的数据直接转为sRGB空间下的值,所以我的128实际存储的是188(不勾选的话存的值就是ps信息面板上看到的值,即128),然后又勾选了嵌入颜色空间,所以iCCP会写入sRGB iec61966-2.1信息
“较小文件(8位)”的意思是png的colortype字段会被设置成3,表示使用8位(最多显示256色)的色板,存储在png开头的PLTE块
在这里插入图片描述
转为srgb、嵌入颜色空间
3.如果新建的时候指定了颜色配置文件,那么项目里更换颜色空间后需要重启,不然实际上还是旧颜色空间。

GITHUB链接

https://github.com/Wxwind/png-test

下一篇

mac photoshop displayp3在windows上显示偏差

引用

PNG规范
Gamma校正与线性工作流入门讲解
【技术美术百人计划】图形 2.6 伽马校正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值