よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【svgwrite】JPGやPNG形式画像をSVG形式(またはその逆)に変換する

今回は、JPGやPNG形式の画像ファイルをSVG形式の画像ファイルに変換する方法。svgwriteというライブラリを使用しています。

SVG → JPG/PNG への変換は最後にリンクだけ貼っています。



参考サイト

Python 画像ファイルjpg/pngをsvgへ変換する「svgwrite」 - PythonとVBAで世の中を便利にする
コードを参考にさせてもらいました。



svgwrite オフィシャル
svgwrite 1.4.1 documentation — svgwrite 1.4.1 documentation



内容と手順

用意した適当なJPG画像をsvgwriteというライブラリを使ってSVGファイルに変換・保存します。
変換後の画像サイズは↓のコードで500×500に指定しています。



実行環境

  • Android
  • Termux
  • Python3.9.6
  • Jupyter Notebook6.4.0
  • 外部ライブラリ
    • svgwrite



外部ライブラリはターミナル等から pip install svgwrite など、環境に合わせてインストールしておく。



画像の変換

import base64 # 標準ライブラリ
import svgwrite


# 変換前画像ファイルパス
input_file = 'Sekizou.jpg'

# 変換後SVGファイルパス
output_file = input_file.split(".")[0] + '.svg'


# 変換前画像ファイルを開く
with open(input_file, "rb") as f:
    img = base64.b64encode(f.read())

# 変換後ファイルを書き込む準備
dwg = svgwrite.Drawing(output_file)

# 保存画像のサイズ等指定と書き込み
dwg.add(dwg.image('data:image/jpg;base64,' + img.decode("ascii"), 
                  size=(500, 500)
                 )
        )

# ファイル保存
dwg.save()
    



画像ファイルサイズの確認

変換前と後でファイルサイズが変化したか確認します。

import os

print(input_file, os.path.getsize(input_file))
print(output_file, os.path.getsize(output_file))
Sekizou.jpg 91342
Sekizou.svg 122104

変換後のSVG画像ファイルサイズが変換前より大きくなりました。9.13KB → 12.2KB。

SVG画像の大きさを500×500に設定しましたが、より大きく、又は小さくしても、変換後のファイルサイズは12.2KBで変化ありませんでした。XMLコードの画像表示サイズが書き変わるだけってことかな。

出来たSVG画像ファイルのXMLコード内で、最初の方にある<svg baseProfile="full"から最後</svg>までを↓にコピペした。かなり長い。
はたして画像は表示されるか?
長くて貼れないので止め。



画像を変換させているコードの中にある
dwg.add(dwg.image('data:image/jpg;base64,' + img.decode("ascii")
の部分で、 data:image/jpg;base64 の「jpg」を「png」に書き換えれば PNGSVG へ変換出来るようです。しかし、書き換えなくても出来た。

img.decode("ascii")の部分は「ascii」でなければならないようです。

先頭の「with」文はお決まりっぽい。



svgwriteについて

最初にリンクを貼っているsvgwriteオフィシャルページを見た感じでは、画像形式の変換専用ソフトではなく、SVGファイルを作る為のドローイング用ライブラリのようです。いろんな図形描いたりできるようだが、検索しても日本語のページはどれも古い。今どき便利なGUIのお絵描きソフトが沢山あるってことで。深掘りしません。



逆にSVG → JPG/PNG の変換方法は

リンクだけ貼っておきます。ライブラリは別のものを使うようです。

SVGをPDFとPNGへ変換する方法【Python】 - Qiita

PythonでSVGをPNGまたはJPEGに変換する方法は?



今回は以上です。