我正在尝试制作可压缩相机图像的应用程序。我有垫子图像和3个单独的通道阵列。我发现了有关离散余弦变换DCT的一些知识,并读到我应该做之字形算法(I've found something with zigzag here)。
我知道DCT可以输出数组,但我看不到之字形也可以在哪里输出。
也许有一个简单的Zigzag算法示例(或带有Zigzag的dct)带有输入和输出数组?
答案 0 :(得分:4)
TL,DR:请参见下面的粗体部分。
从2D像素值数组开始。有64个字节的信息。
在施加偏移并计算DCT之后,输出为频率系数的2D数组。所以现在有64个浮点值。
这是JPEG压缩工作原理的关键。阵列左上方(低频)的频率系数对图像质量比阵列右下方(高频)的频率系数重要得多。
因此,下一步是将量化应用于数组。量化将可变数量的位分配给数组中的每个值。左上方的值获得更多位,而右下方的值获得更少位。量化后,数组看起来像这样。
请注意,右下角的许多值现在为零。所以最后我们进入了锯齿形的样子:
之字形的目的是将量化的DCT系数的2D数组转换为1D数组,其中第一个元素来自2D数组的左上角,随后的元素来自2D数组的右下角。 之字形之后,数组看起来像这样
-26 -3 0 -3 -2 -6 2 -4 1 -3 1 1 5 1 2 -1 1 -1 2 0 0 0 0 0 -1 -1 0 0 ...
其中...
都为0。根据需要进行的压缩程度,可以在任意点处切掉数组。在此示例中,在19个元素之后对数组进行斩波是质量和压缩之间的良好折衷。因此,与存储原始的64个原始像素值相反,只有前19个元素存储在JPEG文件中。
请注意,在切掉锯齿形输出之后,还有其他压缩步骤。链接的文章对此进行了描述。