Python 画像ファイルjpg, pngをsvgへコマンドラインで変換する「Inkscape, Potrace」

 コマンドライン(command line)で、画像ファイルjpg, png, bmp等をsvgへ変換するには、ソフトウェアである「Inkscape」 もしくは 「Potrace」を用いる方法があります。本記事では、これらをPythonスクリプトで実行する雛形コードを載せました。

 下図はjpg画像の例です。テキストとして開くと意味不明です。これはラスタ(raster)形式と呼びます。

 一方、下図はsvg画像の例です。本プログラムを用いて変換したものです。テキストとして開くと文字や数値が記載されていています。これをベクタ(vector)形式と呼び、画像の形状輪郭などが数値, 数式で表されます。

 そのため、svgファイルはCADソフトで読み込むことが可能です。下図は、svgファイルを「FreeCAD」で読み込み、押し出しで3次元構造を作成したものです。

 ここで、注意点があります。拡張子がsvgであっても、数値ではなくてイメージとして記録されてる場合のフォーマットもあります。下図は、コマンドラインによるsvg変換に「Inkscape」を用いた場合です。svgへ変換できてますが、意味がわからない文字列が並んでる様子です。この場合、CADソフトでは読み込めません。

ちなみに、Inkscape」をGUIで使用した場合は、CADで読み込めるsvgを作成できます。「Potrace」ではコマンドラインで出来ます。

 

■本プログラム
 「Potrace」は読み込み画像ファイルは.bmpの必要があるため、pillowを使用してjpgやpngbmpへ変換するコードも含めています。

from glob import glob
import os
from PIL import Image
import subprocess

# ソフトの実行ファイルへのパス
inkscape = r"C:\Program Files\Inkscape\bin\inkscape.exe"
potrace = r"D:\00_backup\01_new\potrace-1.16.win64\potrace.exe"


# インクスケープで、画像ファイルをsvgへ変換する関数
def png2svg(file_path):
    print('png2svg', file_path, '...')

    # 保存ファイル名の作成
    root, ext = os.path.splitext(file_path)
    output_file_path = f'{save_dir}{root}_inkscape.svg'

    # 画像ファイルをsvgへ変換する
    # selection-trace:{scans},{is_smooth[0|1]},{is_stack[0|1]},{is_remove_background[0|1],{speckles},{smooth_corners},{optimize}}
    cmd_list = [inkscape, '--actions="select-all;selection-trace:256,0,1,1,4,1.0,0.20;export-filename:'+output_file_path+';export-do;"',
                file_path, '--batch-process']
    subprocess.call(cmd_list, shell = True)
    print('finished')


# ポートレイスで画像ファイルをsvgへ変換する関数
def bmp2svg(file_path):
    print('bmp2svg', file_path, '...')

    # 保存ファイル名の作成
    root, ext = os.path.splitext(file_path)
    output_file_path = f'{save_dir}{root}_portrace.svg'

    # 拡張子がbmpでない場合に、bmpファイルを作成する
    if ext != '.bmp':
        img = Image.open(file_path)
        img.save(f'{save_dir}{root}.bmp', 'bmp')
        file_path = f'{save_dir}{root}.bmp'
    
    # 画像ファイルをsvgへ変換する
    cmd_list = [potrace, '-s', file_path, '-o', output_file_path]
    subprocess.call(cmd_list, shell = True)
    print('finished')


if __name__ == '__main__':
    # 保存フォルダ
    save_dir = './save_dir/'
    
    # 画像ファイルを取得
    file_list = glob('./*.jpg')
    file_list.extend(glob('./*.png'))
    file_list.extend(glob('./*.bmp'))
    print(file_list)
    
    # ループで回して関数を実行
    for file in file_list:
        #png2svg(file) # Inkscapeで実行
        bmp2svg(file) # Potraceで実行
    
    print('End')

以上

<広告>