引子

我批量制作音乐习题或者视唱练耳的视频,通常会采用github上的一个开源项目。

https://github.com/Chen-and-Sim/SmartCropper

这是陈文戈老师推荐的,确实是方便好用。

我这边使用的流程大致是:

  • 由ly文件或者tex文件生成一个pdf文件
  • 接下来使用mac自带的自动操作里面的一个小功能,把pdf渲染出最高画质的png图像
  • 在windows上使用SmartCropper进行自动裁剪

一切都非常顺利,但是最近在剪辑4k视频的时候,发现谱例有些毛边。

难道矢量图还会模糊?

我仔细思索了一下,估计是只有在pdf文件格式的时候才是矢量的,一旦导出png图片就有了固定的像素?(不过png我怎么记得也是矢量的)

解决办法

那么怎么解决呢?

  1. 我尝试使用latex里面的memoir宏包,把字体调成超大字体的样式。但是失败了,因为会跟lualatex产生冲突。而且还有个问题,字体变大了就会导致pdf的页数变多。那么SmartCropper在识别的时候就会闪退。
  2. 把pdf导出非常高像素的图片,这样SmartCropper裁剪的时候就不会有问题。

pdf2image

人人都说python的库非常丰富,我这次算是体验到了。不管是前两天跟notion相关的,还是今天找到这个。

pdf2image

使用方法作者写的很清楚,首先需要安装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的运算时间。

最后修改:2023 年 03 月 05 日
如果觉得我的文章对你有用,请随意赞赏