record the experience of converting image formats
因有一批CR2格式(RAW)的图片需要转换为jpg格式。因为电脑上没有安装相关的软件,所有就计划利用现有的“开发环境”来自己写一个格式转换的脚本进行自动的批量转换。
首先想到的就是python,经过一番搜索,决定先试下PIL(Python Image Library)这个图像处理库。 PIL目前还未有python3的版本,PIL相关下载请参阅PIL下载页面
▲ PIL下载页面
现在有个叫Pillow(号称friendly fork for PIL,下文简称PIL)移植版本,功能据说是和PIL基本一样,不过它支持python3,请参阅Pillow文档。
安装Pillow
1 | $ pip install pillow |
一个测试脚本,打开CR2格式的图片,打印图片信息并以jpg格式保存图片。
1 | from PIL import Image |
执行脚本,报错了,OSError: cannot identify image file 'xx.CR2'
。
▲ PIL打开CR2文件报错
后面多次尝试结果都一样,于是便用一个jpg文件测试一下,结果是可以正常执行的。
▲ PIL正常打开jpg文件
于是猜想会不会是PIL不支持CR2(RAW)格式的图片,查阅了下相关资料,并未发现CR2,请参阅PIL所支持的格式列表。
利用PIL将CR2文件转换为jpg文件的方法到此结束。
接着我找到了一个可以处理RAW文件的rawkit库,rawkit主页。
这样利用rawkit就可以读取CR2格式图片,不过rawkit主要功能是对RAW文件数据的调整,并没有提供格式转换的功能。
不过前面提到的PIL库中的frombytes
模块可以将图片数据生成图片文件(官方解释:Creates a copy of an image memory from pixel data in a buffer.),请参阅PIL.Image.formbytes。不过中间还需要利用numpy
库,对读取出来的RAW文件的数据进行一些处理。
大概流程:
- 利用rawkit打开RAW文件
- 可以利用rawkit对RAW文件的数据对图片效果进行一些调整(可选)
- 利用numpy处理RAW文件数据
- 利用PIL将相关数据生成图片文件数据(内存)
- 利用PIL将内存中的图片数据保存为指定格式的图片文件
经测试,方法可行,于是整理脚本,对CR2文件进行批量的格式转换。
1 | import os |
运行脚本。
▲ 利用rawkit-numpy-PIL批量转换CR2文件格式
不过,最后查看转换后的图片时,却发现了一个奇怪的问题。
▲ 转换的jpg比原CR2的亮度要低
转换格式后的图片的样式变了,我想应该是RAW文件数据处理的问题,便参考rawkit的文档,调整了几个数据,虽然有些许变化,不过都没能达到原CR2文件预览的效果。
当下我还不想成为一个“图片数据、参数专家”,所以利用rawkit-numpy-PIL这个组合的方法,到此结束。
不过,在上面所说的这些方法之前,已经发现Windows 10上面的照片
自带有一个“保存副本”的功能,利用这个可以将CR2文件保存为jpg格式,而且转换后的图片和CR2预览的效果基本一样。
▲ 利用Windows 10的照片
“保存副本”转换图片格式
于是乎,我又打算从这里入手。当然,因为图片的数量问题,是不可能一个一个的手动操作进行转换的。好在可以利用python进行一个点击、按键的模拟。这样可以写一个“自动化”的脚本,让电脑替代人工来完成这类大量的简单重复操作。
python在Windows上面要实现点击之类的模拟,需要pywin32库,利用它,python可以调用一些Windows上面的接口。请参阅pywin32的Github。
可以将保存副本的操作步骤都记录下来,知道每次点击的像素位置,然后用python的模拟点击进行自动批量操作。因为Windows 10上面的照片
刚好支持快捷键,所用这里用更简单的模拟按键的方法。
1 | import time |
▲ 模拟按键“自动操作”
利用这类方法的缺点就是,需要自己根据实际调整每个步骤的时间间隔,还有在执行时,电脑不能用来做其他的事情。
最后总结,如果不是特别需求,最省事的方法是直接用专门的格式转换工具进行处理。
- Blog Link: https://unihon.github.io/2019-02/record-the-experience-of-converting-image-formats/
- Copyright Declaration: The author owns the copyright. Please indicate the source reproduced!