原因:
Y = 0.257*R+0.564*G+0.098*B+16
Cb = -0.148*R-0.291*G+0.439*B+128
Cr = 0.439*R-0.368*G-0.071*B+128
R = 1.164*(Y-16)+1.596*(Cr-128)
G = 1.164*(Y-16)-0.392*(Cb-128)-0.813*(Cr-128)
B = 1.164*(Y-16)+2.017*(Cb-128)
JPEG采用Y'CbCr色彩空间,RGB转Y'CrCb的时候绿色的分量最大,解码的时候绿色的分量最小。所以说理想情况下绿色的比例是不变的。
然而,因为每个点分量只有8bit,有限字长效应导致在取整的时候g分量变大。这种误差在4:2:0空间下采样的时候被放大。所以有限字长效应是导致压图变绿的元凶。也可能变紫,因为如果绿色分量很小的话它是个负数,而绿色在rgb空间的反色是紫色。
如果jpeg算法采用浮点数的话绿化现象会消失,因为DCT会把时域信号转为频域信号。在这之后取整数的话有限字长误差会变成位置抖动,而不会变成颜色失真。
来自:知乎