引子
我批量制作音乐习题或者视唱练耳的视频,通常会采用github上的一个开源项目。
https://github.com/Chen-and-Sim/SmartCropper
这是陈文戈老师推荐的,确实是方便好用。
我这边使用的流程大致是:
- 由ly文件或者tex文件生成一个pdf文件
- 接下来使用mac自带的自动操作里面的一个小功能,把pdf渲染出最高画质的png图像
- 在windows上使用SmartCropper进行自动裁剪
一切都非常顺利,但是最近在剪辑4k视频的时候,发现谱例有些毛边。
难道矢量图还会模糊?
我仔细思索了一下,估计是只有在pdf文件格式的时候才是矢量的,一旦导出png图片就有了固定的像素?(不过png我怎么记得也是矢量的)
解决办法
那么怎么解决呢?
- 我尝试使用latex里面的memoir宏包,把字体调成超大字体的样式。但是失败了,因为会跟lualatex产生冲突。而且还有个问题,字体变大了就会导致pdf的页数变多。那么SmartCropper在识别的时候就会闪退。
- 把pdf导出非常高像素的图片,这样SmartCropper裁剪的时候就不会有问题。
pdf2image
人人都说python的库非常丰富,我这次算是体验到了。不管是前两天跟notion相关的,还是今天找到这个。
使用方法作者写的很清楚,首先需要安装poppler
。如果是mac上的话可以直接brew,而windows的话可以在它提供的下载链接里直接下载。下载完成之后也不需要安装,只需要过会把路径填写到代码里面就行。
# 引入pdf转换的库
from pdf2image import convert_from_path
from pdf2image.exceptions import (
PDFInfoNotInstalledError,
PDFPageCountError,
PDFSyntaxError
)
# 把pdf文件转换成一个Image对象列表
image_l = convert_from_path(pdf_path='/Users/xhhdd/Desktop/1.pdf', dpi=300, size=(10000, None), thread_count=15)
# 使用Image的save功能保存图片
i = 0
for v in image_l:
i += 1
v.save(f'temp/{str(i).zfill(3)}.png', dpi=(300, 300), compress_level=1)
使用流程算是非常清晰的:
- 先把pdf文件转换成一个Image对象列表
- 接着保存图片即可
使用过程中也遇到一些小问题,比如说
convert_from_path
里指定dpi,但如果Image保存的时候不指定dpi的话,生成的图片dpi都是默认的72。
另外就是,在转换Image对象列表的时候,内存占用挺大的,不知道是不是正常现象。
最后
我也不知道这样算不算好的解决方式,整套流程比之前话的时间多很多,而且更加高分辨率的图片也会加重SmartCropper的运算时间。