
我在「从iPhone拷贝照片,提示设备不可达?」中写到,苹果手机的照片/视频转换功能有BUG,导致拷贝文件过程中提示设备中断。
那么将设置设置成原始格式之后

照片拷贝到Windows正常了,但是拷贝出来的照片的都是原始的HEIC文件。
幸好Windows10可以打开HEIC文件,但是Windows7以及我的一些图片处理软件还未能识别HEIC文件,怎么办?
最好就是将文件格式转换成比较通用的JPG格式吧。
谷歌一下各种软件无法八门,我们都信不过,怕被加料。我们今天用FreeBSD来进行转换。只需要一行命令!
首先,当然需要有转换工具,谷歌提示有一个heif的开源软件可以搞定这个事情。那么我们看看FreeBSD 12.0R中是否有这个软件可以安装。
root@nas:~ # pkg search heif
libheif-1.3.2_2 Libheif is an ISO/IEC 23008-12:2017 HEIF file format de- and encoder
很好!软件仓库中就有。接下来安装之
root@nas:~ # pkg install libheif
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
Checking integrity... done (0 conflicting)
The following 1 package(s) will be affected (of 0 checked):
New packages to be INSTALLED:
libheif: 1.3.2_2
Number of packages to be installed: 1
The process will require 2 MiB more space.
Proceed with this action? [y/N]: y
[1/1] Installing libheif-1.3.2_2...
[1/1] Extracting libheif-1.3.2_2: 100%
5秒钟安装完。
接下来就是转换了。我把照片放在一个NAS的HOME目录的一个临时目录下。~/heic
下面将用一行命令将所有照片转换!
[qianhu@nas ~/heic]$ ls *.HEIC | xargs -I HEIC heif-convert HEIC HEIC.jpg
File contains 1 images
Written to IMG_7195.HEIC.jpg
File contains 1 images
Written to IMG_7196.HEIC.jpg
File contains 1 images
Written to IMG_7197.HEIC.jpg
File contains 1 images
Written to IMG_7198.HEIC.jpg
File contains 1 images
Written to IMG_7199.HEIC.jpg
File contains 1 images
Written to IMG_7200.HEIC.jpg
File contains 1 images
Written to IMG_7201.HEIC.jpg
File contains 1 images
Written to IMG_7202.HEIC.jpg
File contains 1 images
Written to IMG_7203.HEIC.jpg
File contains 1 images
Written to IMG_7204.HEIC.jpg
File contains 1 images
Written to IMG_7205.HEIC.jpg
File contains 1 images
Written to IMG_7206.HEIC.jpg
File contains 1 images
Written to IMG_7207.HEIC.jpg
File contains 1 images
Written to IMG_7208.HEIC.jpg
File contains 1 images
Written to IMG_7209.HEIC.jpg
10秒钟不到任务完成!
聪明的你看了上面的那行命令,是不是不知所措?
我们来讲解一下
- ls *.HEIC ls是list的缩写,列出来当前目录下的所有的扩展名为HEIC文件。如果只执行这个命令的话,结果如下:
[qianhu@nas ~/heic]$ ls *.HEIC
IMG_7195.HEIC IMG_7197.HEIC IMG_7199.HEIC IMG_7201.HEIC IMG_7203.HEIC IMG_7205.HEIC IMG_7207.HEIC IMG_7209.HEIC
IMG_7196.HEIC IMG_7198.HEIC IMG_7200.HEIC IMG_7202.HEIC IMG_7204.HEIC IMG_7206.HEIC IMG_7208.HEIC
- |这根竖线什么鬼?这个就是管道,将ls的输出,也就是上面的这些文件名,不是显示到控制台上,而是通过管道传递给下一个命令。
- xargs呢?这是一个处理输入,并生成命令行执行的工具。
- -I HEIC 什么意思?这个就是对于管道送来的每一个文件名,都用HEIC这个变量表示。
- heif-convert HEIC HEIC.jpg 这个就比较好理解了,heif-convert就是将heif转成jpg的工具,两个参数,一个是输入文件名,另一个是输出文件名。在这里,HEIC就是刚才xargs替换的变量,然后我们设置输出文件名=输入文件名+.jpg
转换完成的结果如下:所有jpg都可以在Windows7中可预览

到这里我们就用一行命令优雅解决这个转换问题。也不用安装什么乱七八糟的程序,不怕电脑被这些程序搞鬼。
是不是很cool?
One More Thing~
上面的转换命令还有没有提升的空间?聪明的你马上想到了,上面的命令执行时,图片是一个一个进行转换,说白了只用上了CPU一个核心的威力。我们来看一下单线程的转换时间。
[bendany@nas ~/heic]$ ls *.HEIC | wc -l
633
[bendany@nas ~/heic]$ time ls *.HEIC | xargs -I HEIC heif-convert HEIC HEIC.jpg
real 3m1.957s
user 6m52.884s
sys 0m24.938s
一共633个HEIC文件,全部转换完花时3分2秒。
接下来我们用xargs来调用多进程进行转换。使用参数-P,我的NAS有20核心40线程,所以用50个进程。
[bendany@nas ~/heic]$ time ls *.HEIC | xargs -P 50 -I HEIC heif-convert HEIC HEIC.jpg
real 0m17.910s
user 11m4.362s
sys 0m27.151s
这一次只用了18秒!相对于之前的3分2秒,182秒,大概是十分之一的时间。cool!
如果你喜欢今后能多看到类似的文章,请看完之后点赞收藏分享,这样子我就可以有动力多写一些啦~~~