Skip to content

[Python] 透過 svglib 將 SVG 轉成 PNG

Last Updated on 2021-10-12 by Clay

在開發專案的時候,雖然 SVG (Scalable Vector Graphics, 可縮放向量圖) 是非常好用的圖片格式,但有時候我們還是需要一般的 PNG 格式來製造界面。

比方說,我在使用 PyQt5 撰寫界面的時候曾經遇到過 SVG 的圖片條紋消失的問題,在那之後,將圖片轉成 PNG 格式就沒有這個問題了。

今天就來簡單介紹如何使用 Python 將 SVG 的圖片轉成 PNG 吧。


SVG

是一種基於 XML 的圖形格式,通過敘述來描繪二維向量圖形的格式,有著自己的固定標準。

如果我們將一張 SVG 圖片用 Python 讀取:

這張是原圖。

print(open('input/ice.svg', 'r', encoding='utf-8').read())


Output:

<?xml version="1.0" encoding="UTF-8"?>
<svg width="100px" height="100px" viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 50.2 (55047) - http://www.bohemiancoding.com/sketch -->
<title>mdpi/*/icons/svg/ice</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="*/icons/svg/ice" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Group" transform="translate(17.000000, 1.000000)">
<polygon id="Path-7" fill="#000000" fill-rule="nonzero" points="22.3153336 0 44 17.3574154 44 50.1643429 22.3621974 68 0 50.1930808 0 18.2289582"></polygon>
<polygon id="Path" fill="#AFCCEB" points="22.8494357 8 6 21.5793953 6 47.7995504 22.802651 61 39 47.827855 39 20.7542998"></polygon>
<polygon id="Path-8" fill="#37609F" fill-rule="nonzero" points="21.9136416 20 32 27.8870243 32 42.7034852 21.9638023 51 12 42.6983119 12 28.4119176"></polygon>
<polygon id="Path" fill="#AFCCEB" points="22.0218836 26 17 30.6553527 17 40.4690982 21.9775907 45 27 40.4641075 27 30.2527318"></polygon>
<polygon id="Path-9" fill="#000000" fill-rule="nonzero" points="53.1938749 54 67 66.677861 67 87.0085565 53.1722954 99 39 87.0278418 39 66.6563331"></polygon>
<polygon id="Path" fill="#AFCCEB" points="43 69.3303304 43 85.120844 52.6361735 93 62 85.1400901 62 69.3088463 52.6518923 61"></polygon>
<polygon id="Path-8" fill="#37609F" fill-rule="nonzero" points="52.4525029 69 58 73.3251423 58 81.4502983 52.4800913 86 47 81.4474614 47 73.6129871"></polygon>
</g>
</g>
</svg>


我們可以看到這是一個描述的文件,可以依此產生出圖片。


SVG 轉成 PNG

這裡我是使用一個方便的模組:svglib。如果是第一次使用,需要以以下指令下載安裝:

pip3 install svglib


有興趣的可以參考 PyPi 上的 svglib 文件: https://pypi.org/project/svglib/

安裝好後,其實我們只需要簡單的幾行程式碼便可完成我們的任務:

# -*- coding: utf-8 -*-
from svglib.svglib import svg2rlg
from reportlab.graphics import renderPM

drawing = svg2rlg('input/ice.svg')
renderPM.drawToFile(drawing, 'output/ice.png', fmt='PNG')


其中,ice.svg 是我要輸入的圖片,ice.png 是我要輸出的圖片。

Output:

Leave a Reply