先簡單介紹一下四叉樹QuadTree,四叉樹是一個樹狀的資料結構,經常運用在畫面處理或是2D的碰撞檢測。
從根節點root出發,當節點內達到一個條件的時候會再分裂成四個子節點。
詳細的介紹可以看Quadtree - Wikipedia
樹可能會長這樣(圖片取自wiki)
把圖片讀進來後在compress
這個method裡面做處理。如果有tiff檔無法讀取的狀況,請加入jai-imageio-core這個lib
1 | public static BufferedImage compress(BufferedImage image, double threshold) { |
threshold是設定離散程度到多少要分裂
這裡寫個一個ImageMeasure類別來對圖像讀進來的資料作運算approximate
運算區域內像素的色彩近似值measureDetail
運算區域內色彩的離散程度
1 | public Color approximate(Color[][] data, int x, int y, int width, int height) { |
quadtree中新增節點的時候則看運算的結果來決定要不要分裂以及節點的顏色近似值
1 | public Node(Color data[][], int x, int y, int width, int height) { |
這是運算之後的結果
完整程式碼在這裡
Quadtree Compression