Skip to content

图片电子包浆 qqtelegrammomotalk

图片包浆[图片]
该指令需要一张图片,图片可通过参数,回复消息,交互式命令指定
图片参数具体请参考<指令格式简介-图片>
给图片加上电子包浆

电子包浆的原理:
电子包浆是因为在android 9之前系统核心代码的一个bug。android系统给开发者提供了一个图像压缩接口,可以让开发者方便地压缩JPEG图片。
但这个接口的底层实现算法为了加速压缩计算过程,从 16 位定点数降低到了 8 位定点数,
并且在进行这个变换运算的最后一步,需要除以 256,而代码中,采用了右移操作代替除法以提高执行速度。

c
int  y = ( CYR*r + CYG*g + CYB*b ) >> CSHIFT;
int  u = ( CUR*r + CUG*g + CUB*b ) >> CSHIFT;
int  v = ( CVR*r + CVG*g + CVB*b ) >> CSHIFT;

问题出在:
1、直接截断了小数部分,等价于 trunc()。如果符号数是用补码实现的。即全部往负数方向取整。如:1.2 → 1; 3.9 → 3;0.0 → 0;-5.1 → -6.
2、较冒险的符号数移位:根据规范的定义,对符号数(可正可负的数)使用移位的效果将由具体的编译器明确定义决定(implementation-defined)。因为移位是一个符号无关的操作,对符号数移位将依赖于符号数的具体表现形式。而这个形式 C++ 没有给出一个限定,由具体的编译器自行决定,对于非“补码 ”(2's complement)的情况结果可能并不是所期待的那样数值整除2的幂。这里假设了编译器都能“正确”理解为整除。

YUV 值向负方向取整自然导致土图片变暗,变绿。 这个错误的舍入,使得所有在 0 ~ 255 范围内非整数的 YUV 值都受到影响。,
随之而来的大量其他有损操作(比如 DCT 变换之后滤去高频)又会使得 YUV 值发生变化:
如果发生变化,假设随机产生关于 0 对称的误差,那么实际上也有 50% 的机率使得这个数值 -1,因为只要比原来的值小,都会被向下舍去。
这使得,图片随着 Skia 缺陷的色彩空间变换算法反复压缩,越来越绿。

上次更新于: