JPEG是一种常见的图像文件格式,也是目前静态图像中压缩比最高的一种图文格式。通常在JPEG编码过程中有一个非常重要的步骤,就是Z字型编排过程:经过前期处理的图像被分为若干个8*8的小图像块,此时就从小图像块的左上角开始沿Z字型对图像元素进行遍历,并将结果重新写入到等大小的图像块中。
原始图像矩阵序号如下:
经过Z字型编排,过程如下图:
Z字型编排就是对原始矩阵进序号行重新排列,从矩阵的0处开始,每过一个格子,将此时的步数记录下来,经过排列后的原图像矩阵中的序号为:
规律:
- 当row = 0 或者 row = 7,且j为偶数时,向右侧移动一个格子。
- 当column = 0 或者 column = 7 且i为奇数时,向下移动一个格子。
- 当 row + column 为奇数时向左下角移动一个格子。
- 当 row + column 为偶数时向右上角移动一个格子。
Swift程序如下:
//-----------------------数据初始化-----------------------
var originArr: [[Int]] = []
var zigArr: [[Int]] = Array.init(repeating:
Array.init(repeating: 0, count: 8), count: 8)
let SIZE: Int = 8
for row in 0..<SIZE {
var t: [Int] = []
for column in 0..<SIZE {
t.append(row * SIZE + column)
}
originArr.append(t)
}
//-----------------------算法开始-----------------------
var i:Int = 0 , j: Int = 0
for row in 0..<SIZE {
for column in 0..<SIZE {
zigArr[i][j] = originArr[row][column]
if(i == 0 || i == SIZE - 1) && (j % 2 == 0) {
j += 1
continue
}
if(j == 0 || j == SIZE - 1) && (i % 2 == 1 ) {
i += 1
continue
}
if (i + j) % 2 == 1 {
i += 1
j -= 1
continue
} else if (i + j) % 2 == 0 {
i -= 1
j += 1
continue
}
}
}