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

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

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

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

时间: 2024-12-25 18:25:55

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

shell 批量压缩指定文件夹及子文件夹内图片

shell 批量压缩指定文件夹及子文件夹内图片 用户上传的图片,一般都没有经过压缩,造成空间浪费.因此须要编写一个程序,查找文件夹及子文件夹的图片文件(jpg,gif,png),将大于某值的图片进行压缩处理. 代码例如以下: #!/bin/bash # 查找文件夹及子文件夹的图片文件(jpg,gif,png),将大于某值的图片进行压缩处理 # Config folderPath='/home/fdipzone/photo' # 图片文件夹路径 maxSize='1M' # 图片尺寸同意值 max

(转) Ubuntu 更改文件夹及子文件夹权限

Linux系统下如何修改文档及文件夹(含子文件夹)权限,我们来看一下. 一 介绍: 可以使用命令chmod来为文件或目录赋予权限.Linux/Unix 的档案存取权限分为三级 : 档案拥有者.群组.其他.利用 chmod 可以藉以控制档案如何被他人所存取 二 详解 1 此命令有两种使用方法,一种是chmod后加数字,后接文件名 chmod abc file 其中a,b,c各为一个数字,分别表示User.Group.及Other的权限. r=4,w=2,x=1 若要rwx属性则4+2+1=7: 若

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

package ioTest.io3; import java.io.File; /* * 获取一个目录下的所有文件夹和文件,包括子文件夹和子文件 . * 并将文件夹和文件名称打印在控制台上面.并且要显示文件目录的层级 * 注:运用了递归的算法. */ public class FileDemo3 { public static void main(String[] args) { File dir=new File("F:\\黑马学习日程\\"); //File dir=new Fi

nodejs 文件系统(fs) 删除文件夹 及 子文件夹下的所有内容

http://blog.163.com/hule_sky/blog/static/2091622452015112821829773/ node 文件系统fs 为我们提供了一些方法 进行文件和文件夹的读写删除等操作 下边将介绍删除文件夹及子文件夹下的所有内容的相关命令(均含有同步和异步方法) 1. fs.stat && fs.statSync 提供了访问文件的属性信息 2. fs.readdir && fs.readdirSync 提供读取文件目录信息 3. fs.unli

列出某文件夹及其子文件夹下面的文件,并可根据扩展名过滤

/** * 列出某文件夹及其子文件夹下面的文件,并可根据扩展名过滤 * * @param path */ public static void list(File path) { if (!path.exists()) { System.out.println("文件名称不存在!"); } else { if (path.isFile()) { if (path.getName().toLowerCase().endsWith(".pdf") || path.get

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

Linux C  下面读取文件夹要用到结构体struct dirent,在头#include <dirent.h>中,如下: 1 #include <dirent.h> 2 struct dirent 3 { 4 long d_ino; /* inode number 索引节点号 */ 5 off_t d_off; /* offset to this dirent 在目录文件中的偏移 */ 6 unsigned short d_reclen; /* length of this d

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

1. 没有后缀名的限制: string[] filePaths = Directory.GetFiles(@"c:\MyDir\"); 2. 有后缀名: string[] filePaths = Directory.GetFiles(@"c:\MyDir\", "*.bmp"); 3. 获取文件夹以及子文件夹里面的所有文件:  设置SearchOption.AllDirectories 属性 string[] filePaths = Direct

Java 遍历指定文件夹及子文件夹下的文件

/** * 遍历指定文件夹及子文件夹下的文件 * * @author testcs_dn * @date 2014年12月12日下午2:33:49 * @param file 要遍历的指定文件夹 * @param collector 符合条件的结果加入到此List<File>中 * @param pathInclude 路径中包括指定的字符串 * @param fileNameInclude 文件名称(不包括扩展名)中包括指定的字符串 * @param extnEquals 文件扩展名为指定字

遍历文件夹及其子文件夹下的.pdf文件,并解压文件夹下所有的压缩包

List<PDFPATH> pdfpath = new List<PDFPATH>(); List<string> ziplist = new List<string>(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { FolderBrowserDialog dialog = new FolderBrows