首页 > 技术文章 > Z形重排

hbg200 2018-05-05 20:30 原文

    DCT后,需要按Z形扫描规则,由阵列(两维数组)转为一维数组,供压缩用。

Z形扫描路径示意图:

Z形扫描地址示意图:

测试数据图:

Z形扫描结果图:

图中可以看出,由左上侧开始,到右下侧结束,Z形由此而来。

实现思路:由两维数组(阵列)转一维数组,通过两维循环,取出输入阵列数据,传递至由Z数组指向的,一维数组的地址位置。

源程序如下:

BYTE bzZTestData[8][8] = //Z形测试数据
{
{ 0, 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, 33, 34, 35, 36, 37, 38, 39},
{40, 41, 42, 43, 44, 45, 46, 47},
{48, 49, 50, 51, 52, 53, 54, 55},
{56, 57, 58, 59, 60, 61, 62, 63}
};

const unsigned char ZigzagSrc[8][8] = //Z扫描一维数组源地址
{
{ 0, 1, 8, 16, 9, 2, 3, 10},
{17, 24, 32, 25, 18, 11, 4, 5},
{12, 19, 26, 33, 40, 48, 41, 34},
{27, 20, 13, 6, 7, 14, 21, 28},
{35, 42, 49, 56, 57, 50, 43, 36},
{29, 22, 15, 23, 30, 37, 44, 51},
{58, 59, 52, 45, 38, 31, 39, 46},
{53, 60, 61, 54, 47, 55, 62, 63}
};

const unsigned char ZigzagDst[8][8] = //Z扫描一维数组目的地址
{
{0, 1, 5, 6, 14, 15, 27, 28},
{2, 4, 7, 13, 16, 26, 29, 42},
{3, 8, 12, 17, 25, 30, 41, 43},
{9, 11, 18, 24, 31, 40, 44, 53},
{10, 19, 23, 32, 39, 45, 52, 54},
{20, 22, 33, 38, 46, 51, 55, 60},
{21, 34, 37, 47, 50, 56, 59, 61},
{35, 36, 48, 49, 57, 58, 62, 63}
};

void __fastcall ZigScan_8x8(int czOutPut[], int czInPut[][8])//Z变换,阵列到数组
{
   for(int i = 0; i < 8; i++)
   for(int j = 0; j < 8; j++)
      {
         czOutPut[ZigzagDst[i][j]] = czInPut[i][j];
      }
}

void __fastcall ZigScan_8x8(int czOutPut[][8], int czInPut[])//Z变换,数组到阵列
{
   for(int i = 0; i < 8; i++)
   for(int j = 0; j < 8; j++)
      {
         czOutPut[i][j] = czInPut[ZigzagSrc[i][j]];
      }
}

网上其他程序实现有些复杂,这里以间接地址Z形变换实现。

 

推荐阅读