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
}
}
}