起因:

在我自己写Blog时,想把MarkDown的内容转成一个长图,但是不会用PS,所以很纠结,只能自己动手做一套生成长图的流程

Automator 工具

在Mac上有一个很不起眼但是非常好用的工具叫Automator,可视化编程,可以大大提高我们自动化的效率,下面针对合成长图进行介绍

  1. 首先我们打开Automator时,选择服务一栏
  2. 拖入如图下的三个组件

    • 值得注意的是,你需要选择服务接收到选定的PDF文件,并且位于Finder(神他妈访达)
  3. 然后起名为 PDF 转 PNG
  4. 紧接着我们右键点击对应的PDF文件,如下图所示

  5. 程序执行完毕后,会在桌面生成一组图片

  6. 这是Automator的任务已经结束了,下面我们需要写一个python脚本,让代码来将这几个散图拼接成一个长图,下面是python的代码部分

#!/usr/bin/python
#encoding=utf-8

import numpy as np
from PIL import Image
import glob,os

if __name__=='__main__':
    prefix=input('Input the prefix of images:')
    files=glob.glob(prefix+'_*')
    num=len(files)

    filename_lens=[len(x) for x in files] #length of the files
    min_len=min(filename_lens) #minimal length of filenames
    max_len=max(filename_lens) #maximal length of filenames
    if min_len==max_len:#the last number of each filename has the same length
        files=sorted(files) #sort the files in ascending order
    else:#maybe the filenames are:x_0.png ... x_10.png ... x_100.png
        index=[0 for x in range(num)]
        for i in range(num):
            filename=files[i]
            start=filename.rfind('_')+1
            end=filename.rfind('.')
            file_no=int(filename[start:end])
            index[i]=file_no
        index=sorted(index)
        files=[prefix+'_'+str(x)+'.png' for x in index]

    print(files[0])
    baseimg=Image.open(files[0])
    sz=baseimg.size
    basemat=np.atleast_2d(baseimg)
    for i in range(1,num):
        file=files[i]
        im=Image.open(file)
        im=im.resize(sz,Image.ANTIALIAS)
        mat=np.atleast_2d(im)
        print(file)
        basemat=np.append(basemat,mat,axis=0)
    final_img=Image.fromarray(basemat)
    final_img.save('merged.png')

最后我们需要在terminal上面执行此py脚本
merged.png 就是我们最终执行的结果啦~


What doesn’t kill you makes you stronger.