用Java寫一個Photo Mosaic

早在兩星期前也寫了個“馬賽克拼圖”,不過只支持黑白色的圖片,昨天試了下拼彩色圖片,先來一張預覽圖,效果還是可以的



實現思路

1、準備大量小張方形素材,爲了方便表述,姑且稱這些圖片爲“Tile”

2、對於每一個Tile,作如下處理:

  1. 統一壓縮成同一大小,我壓縮成了32x32
  2. 計算平均RGB值
  3. “簡化”RGB值,我這麼做是因爲Tile素材量還不夠大,我希望能將平均RGB值相近的Tile都歸爲一組,分組也方便後面對原圖匹配步驟。我將每R,G,B都簡化成三種值,0,127,254(0x00,0x7f,0xfe),那麼簡化後RGB可以組成27種不同的顏色,這樣一來會有27個RGB顏色的分組,可以用文件夾將它們分組,如下圖(我用的Tile素材大約有1000來張,但是顏色分佈  不是很均勻,所以實際只分出了20組,有7組是沒有圖片分進去的,後來我是手動調整了一下,也可能是因爲我的分組算法存在點缺陷,有空優化一下)


3、上面都是Tile的準備,下面開始處理做拼接,先準備一張原圖片,將它壓小一點,建議高寬在60~100之間,太小效果不好,太大處理量會很大,至於怎麼壓縮有多種方法,可以直接用畫圖,也可以調用Java的API

4、讀取壓縮後的圖片每一點的RGB值,將它“歸類”到RGB最相近的Tile分組,例如某點rgb值是0x12f97e,最近的RGB值是0x00fe7f,然後從分組的多張圖片裏隨機挑選一張Tile,在相應座標上繪製這張Tile,這個座標計算很容易,例如取(2,4)點的RGB值,Tile的大小是32x32,那麼我應該把Tile擺在(64, 128)這點上,因爲(2x32, 4x32)=(64, 128)

5、關於怎麼讓每次在同一分組上挑選的圖片“隨機”也是個重要的問題,因爲對於原圖片大片同色區域,都用同一張Tile效果 可反而不是很好。可以用簡單的隨機數生成,我的做法是將分組裏的圖片隨機排列,按排列順序依次取Tile,當取到最後一張Tile時,重新打亂這個排列,從開頭開始取Tile。當然有效果更好的方法是每次取Tile都檢測下週圍是否已經用過這張Tile,當然這樣開銷會大一點,算法實現起來也複雜一點


實現代碼

這裏就不全部貼出來了,代碼我放在github上

https://github.com/Kurozaki/color-graphic-mosaic


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章