批量改变文件夹和子文件夹中图片格式的两种方法

Posted xh6300

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了批量改变文件夹和子文件夹中图片格式的两种方法相关的知识,希望对你有一定的参考价值。

 

生活中,我们通常会遇到这种问题:一个文件夹内部有多个子文件夹,每个文件夹内部有很多图片,我们想改变这些图片的格式。

 

例如.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来解决这个问题存在一个缺陷:转换后的图片只能保存在一个文件夹中,而不能像原文件那样保存在不同文件夹中(例如不同子文件夹中)。其实也可以理解,毕竟别人做好了的软件不如自己写代码来得灵活。

 

不管采用上面的哪种方法,如果图片有成千上万张的话,对于效率的提升都是惊人的——让电脑在不停地运转,出去遛个弯回来,它就全部弄好了。

以上是关于批量改变文件夹和子文件夹中图片格式的两种方法的主要内容,如果未能解决你的问题,请参考以下文章

dflatex插入EPS格式图片的两种方法

C# 将多个图片合并成TIFF文件的两种方法

bat批量修改图片的名字实现(两种方法)

利用VBA如何将批量图片导入WORD的指定表格格式里?

利用VBA如何将批量图片导入WORD的指定表格格式里?

php获取图片真实后缀的两种方法