批量改變文件夾和子文件夾中圖片格式的兩種方法


 

生活中,我們通常會遇到這種問題:一個文件夾內部有多個子文件夾,每個文件夾內部有很多圖片,我們想改變這些圖片的格式。

 

例如.png格式圖片支持背景透明,但我們想把它變成背景不透明的.jpg圖片。又比如.bmp格式是非壓縮圖片,我們想把它轉換為無損壓縮的.png圖片以節省存儲空間。

 

如果圖片數量很少,很明顯我們可以通過Windows自帶的畫圖工具或者其他看圖軟件通過“另存為”一張張地轉換圖片格式。但是如果圖片很多,怎么辦?

 

這個問題其實有兩個關鍵點:

① 要求批量處理。

② 文件夾中還有子文件夾。

 

由於我同時熟悉Halcon和Photoshop,因此我提供兩種方式,供不同的讀者參考。

 

一、用Halcon批量修改圖片格式。

 

原文件夾和圖片如下所示:

 

代碼如下:

 1 list_files ('D:/pic', ['files','recursive'], ImageFiles)  2 *'ignore_case':忽略大小寫  3 tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)  4 for Index :=0 to |ImageFiles| - 1 by 1
 5  read_image (Image, ImageFiles[Index])  6     *tuple_strlen是得到tuple中某個元素的長度,而不是tuple有幾個元素  7  tuple_strlen (ImageFiles[Index], Length)  8     
 9     *之所以 - 5 是因為要去掉“.bmp” 10     tuple_substr (ImageFiles[Index], 0, Length -5, Substring) 11     write_image (Image, 'png', 0, Substring) 12    
13 endfor

 

說明:

算子list_files的參數'recursive'的意思是“遞歸”,即遞歸查找子文件夾中的文件;ImageFiles[Index]是每張圖片的實際路徑。通過對路徑字符串的截取操作,獲得不含.bmp后綴的文件名,然后最終將圖片保存為.png格式。

 

處理結果如下:

可以看到,圖片已經批量轉換成功,且.png格式圖片占據的存儲空間明顯小於.bmp文件。

 

代碼當然還有改進的空間,例如我想在存為.png文件的同時,刪除原.bmp文件。代碼修改如下:

 1 list_files ('D:/pic', ['files','recursive'], ImageFiles)  2 *'ignore_case':忽略大小寫  3 tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)  4 
 5 hadTransform := 0
 6 for Index :=0 to |ImageFiles| - 1 by 1
 7  read_image (Image, ImageFiles[Index])  8     
 9     if (hadTransform = 1) 10         delete_file (ImageFiles[Index -1]) 11  endif 12     
13     *tuple_strlen是得到tuple中某個元素的長度,而不是tuple有幾個元素 14  tuple_strlen (ImageFiles[Index], Length) 15     
16     *之所以 - 5 是因為要去掉“.bmp” 17     tuple_substr (ImageFiles[Index], 0, Length -5, Substring) 18     write_image (Image, 'png', 0, Substring) 19     hadTransform := 1
20 endfor 21 
22 delete_file (ImageFiles[Index -1])

最后一行代碼delete_file (ImageFiles[Index -1])的作用是跳出for循環后,刪除最后一張.bmp圖片。

 

 

二、用Photoshop批量修改圖片格式。

 

這個我粗略說一下。

① 先在Photoshop里面錄制一個轉為.png的動作(窗口——動作)。

② 通過“文件——自動——批處理”,可以批量執行剛才錄制的動作。

 

 

相對於第一種方式來說,用Photoshop來解決這個問題存在一個缺陷:轉換后的圖片只能保存在一個文件夾中,而不能像原文件那樣保存在不同文件夾中(例如不同子文件夾中)。其實也可以理解,畢竟別人做好了的軟件不如自己寫代碼來得靈活。

 

不管采用上面的哪種方法,如果圖片有成千上萬張的話,對於效率的提升都是驚人的——讓電腦在不停地運轉,出去遛個彎回來,它就全部弄好了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM