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

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

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

转载于:https://www.cnblogs.com/xh6300/p/7260971.html

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

  1. 遍历文件夹(含子文件夹)方法

    做法基本上有2大类: ① 经典Dir ② FSO 即 Scripting. File System Object 的[文件系统对象]脚本方法. 一开始可能Dir方法较为普遍,但随着水平的提高,应用FS ...

  2. MAC 修改文件夹以及子文件夹权限

    转载于:https://blog.csdn.net/sunny_forever/article/details/52761078 MAC 修改文件夹以及子文件夹和子文件权限 以及 修改文件夹owner ...

  3. redhat 复制文件夹及子文件夹_python文件夹怎么操作呢??(建议详读)

    当前工作目录 >>> import os >>> os.getcwd() 我电脑上的结果为: 'C:Users我的电脑AppDataLocalProgramsPyt ...

  4. linux递归赋权限,Linux下递归更改文件夹和子文件夹的权限

    为所有Web应用程序设置适当的文件权限都是Web主机的重要组成部分.在本教程中,您将了解如何在单个命令中递归地更改文件夹和子文件夹上的文件权限. 如您所知,在Linux中,所有内容都被视为一个文件.一 ...

  5. Linux C 读取文件夹下所有文件(包括子文件夹)的文件名

    本文:http://www.cnblogs.com/xudong-bupt/p/3504442.html Linux C  下面读取文件夹要用到结构体struct dirent,在头#include ...

  6. c++利用windows api遍历指定文件夹及其子文件夹中的文件

    以下代码在vs2008中测试通过,利用FindFirstFile,FindNextFile函数遍历了我电脑上全路径为"C:\\Users\\v_tianboli\\Desktop\\wind ...

  7. java ftp遍历所有子文件_Java 遍历指定文件夹及子文件夹下的文件

    Java 遍历指定文件夹及子文件夹下的文件 /** * 遍历指定文件夹及子文件夹下的文件 * * @author testcs_dn * @date2014年12月12日下午2:33:49 * @pa ...

  8. 获取文件夹以及子文件夹里面的所有文件

    1. 没有后缀名的限制: string[] filePaths = Directory.GetFiles(@"c:\MyDir\"); 2. 有后缀名: string[] file ...

  9. java 获取子文件夹_JAVA之File类 获取一个目录下的所有文件夹和文件,包括子文件夹和子文件...

    package ioTest.io3; import java.io.File; /* * 获取一个目录下的所有文件夹和文件,包括子文件夹和子文件 . * 并将文件夹和文件名称打印在控制台上面.并且要 ...

最新文章

  1. Minimum Path Sum
  2. 用 PHP 读取 XML
  3. boost::stl_interfaces::reverse_iterator相关的测试程序
  4. NeHe OpenGL教程 第二十一课:线的游戏
  5. 关于在ubuntu下配置AMD显卡驱动的总结
  6. UILabel的高度自适应
  7. [翻译] NumSharp的数组切片功能 [:]
  8. Java集合(4)--List接口及其实现类ArrayList、LinkedList和Vector
  9. (王道408考研操作系统)第五章输入/输出(I/O)管理-第一节5:假脱机(SPOOLing)技术
  10. (73)FPGA模块调用(VHDL调用system Verilog)
  11. 非经营性网站备案流程
  12. 稳定婚姻问题和Gale-Shapley算法(转)
  13. (搬运)手机卫星通信详细科普图漫版
  14. Lisp面面观松本行弘谈Lisp元编程
  15. 我见过最清晰的–理解梯度,散度,旋度
  16. [疯狂Java]I/O:流模型(I/O流、字节/字符流、节点/处理流)
  17. csgo社区服务器维护2021,CSGO国际服启动软件
  18. 在sql 2000中实现Oracle 中 rownum的功能
  19. 继俄罗斯之后,中国也要拥有自己的 Sailfish 移动系统了
  20. 四六级听力考试高频词汇分类记忆-职场工作类

热门文章

  1. 微信小程序开发系列二:微信小程序的视图设计
  2. 乾坤大挪移:SAP CRM WebClient UI 和 SAP Fiori UI 混搭并存
  3. 【复习】操作系统第一章
  4. php trace 图形,trace工具定位php性能问题
  5. php通知websocket,php实现websocket实时消息推送
  6. 声呐图像数据集_MaskedFace-Net 口罩人脸基准数据集,13万+图像数据
  7. python学习-综合练习三(斐波那契数列、阿姆斯特朗数、//和/、十进制转二进制bin、八进制oct、十六进制hex、进制转换源码、python中::和:的区别)
  8. Android无需权限保存文件,即使使用用户权限,也无法在外部存储上保存文件[Android]...
  9. linux更改甜器名称,Linux添加swap分区
  10. 贵州计算机专业强的专科学校,贵州排名靠前的五年制大专学校--贵州计算机学校...