似乎目前所有商用的Eink设备都只能支持到16级灰度。然而也没有办法得到更多灰度等级呢?很多古董硬件上(比如CGA、Commodore64、GBC)都有人去尝试破解发色数上限,现在,轮到Eink了。

如题图,“破解”是可行的,或者说其实本来就不存在16级灰度的限制。(右上角是16级灰度效果对比)

顺便,2018年新年快乐!

讲讲大致的实现思路吧。最简单的来说,要在Eink屏幕上显示图像,需要向屏幕刷新多帧的图像,最终显示效果,是这些帧的叠加。为了确定每帧要发送的数据,通常都是使用一个被称为波形表的查找表。波形表通常由屏幕驱动解决方案提供商提供,由于涉及商业机密,一般人并没有办法直接拿到。前面说的所有商用Eink设备都只能支持16级灰度,那是因为并不存在32级灰度的波形表。

所以自己做一个就好了咯!如果真的做得到的话……波形表是一个4维查找表,输出取决于当前灰度,目标灰度,当前所在帧序列,以及温度。要自己做一个这样的波形表太困难了,可能也是不存在商用的32级灰度的波形表的原因之一。

所以为了强行实现效果,就要想办法调整一下波表的实现。4维太多了,要是1维就好了。首先,无视温度,然后只从全白开始。这样就已经是二维了。接着,人为让目标灰度永远等同于当前所处的帧数,也就是5级灰度永远是32场完成,而每一场都只刷新那些不够黑的像素,白的就白的留着就好了。那查找表做什么呢,连输出灰度都跟着一块解决了。所以现在新的查找表查找的内容是每行的时长,通过控制每场的时间来分别调整每一级灰度的具体的呈现颜色。虽然可能比正常的方法稍慢,但是图像显示效果还是非常好的。

const unsigned char timA[32] =
{
// 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
  30,30,30,20,20,20,20,30,30,30,30,30,30,30,30,30,30,30,40,40,40,40,50,50,50,50,60,90,90,100,120,160
};