2010年9月16日 星期四

重複圖片刪除軟體試做!!


    這個就是目前以 VB 試做重複圖片刪除軟體的結果,這個是可以觀察版,另外我最後採用了不可觀察直接刪除的作法,雖然比較冒險,不過我認為誤刪的機會也相當的低。

    首先,就是這個軟體的功能設定,主要就是將同一個目錄下面(含子目錄)的圖形檔(這版目前狹隘的設定為 jpeg事實上是可以放更開的。),利用檔案長度的排序,來做圖形的比對。

    1.排序法:


    一開始搜尋網路上的資料,並參考快速排序法(註一可前往網頁參考網頁),以VB實際寫出快速排序法。但 VB 的陣列與  C 的陣列似乎有相當的差異性,無法自由自在的使用未定長度的陣列,以致於在定義陣列長度來放入檔案排序相當的困難。

    經過長時間的尋找 MSDN 給的建議,發現 VB 要使用這種不定長度的陣列,目前最好的方法似乎是使用集合 ( collect() )。所以靈光乍現拋棄了「效率」這兩個字(自家使用軟體,似乎也沒有那麼需要效率),使用元件來呼叫collect似乎是最方便的?

    因此目前的實際作法為 — 使用 listbox 將檔案長度加上檔案名稱直接存入listbox, 每個檔案都為 collect 的一個 item,如此就可以從collect 的長度定義出固定長度的陣列來使用。
  
    最佳排序法也變成了 listbox 自帶的字元遞增排序。因此,故意將檔案長度放在 item 的前方,listbox 自然就幫你將檔案依照字元排好了,怎麼排不重要,重點就是相同大小的一定會排在一起!!到此為止,排序法大功告成。

    2.比對圖檔


    因為,已經經過排序,圖檔的比對變成相當的簡單,只需要將圖檔依序與下一個檔案比對長度是否相同,如果相同的話,則叫出圖檔以 picbox 顯示,讓使用者決定是否刪除。當然,同樣重複的圖檔可能有兩個以上,就在後面加上一個迴圈,是他繼續比對下一個圖檔,直到大小不同為止。

    這樣手工比對檢查程式,發現相同大小的檔案(大小完全相同 byte),但是不同圖檔的比例相當的不低。因為圖檔多為大小近似的檔案,所以重複率比一般檔案多很多,如果要交給程式去自動判斷這樣就會出現誤刪的問題。

    此時,若要採用電腦判斷圖檔,就必須將圖檔讀入做 byte 的比對。因此,使用 computer.filesystem.readallbyte 函數將檔案丟入變數,看要取用多少去比對,根據個人使用經驗,我取檔案中點比對,幾乎沒有發現重複的檔案(發生過一次), 如果採取離散三到四點的比對或是連續3、4點的比對,圖檔誤判率應該會降到極低,不過這是效率跟圖檔重要性之爭,就完全看個人取捨了!!

    這算是一個簡單的程式,不過對於電腦裡面有雜亂的圖庫的人算是實用。比圖刪圖就是這麼簡單!!


註一:快速排序法參考  http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/QuickSort1.htm

沒有留言:

張貼留言