แปลง SVG เป็น PNG ใน Python


102

ฉันจะแปลงsvgไปpngในงูใหญ่? ฉันกำลังจัดเก็บsvgในตัวอย่างของStringIO. ฉันควรใช้ไลบรารี pyCairo หรือไม่? ฉันจะเขียนโค้ดนั้นได้อย่างไร?


3
อาจซ้ำกันของstackoverflow.com/questions/2932408/…
Optimal Cynic

3
เธรดนั้นปล่อยให้ปัญหาไม่ได้รับการแก้ไข คำตอบที่ได้รับการยอมรับมาจากผู้ถามที่แชร์รหัสพยายามที่ล้มเหลว คำตอบอื่นแนะนำ ImageMagick แต่ผู้แสดงความคิดเห็นกล่าวว่า ImageMagick "เป็นงานที่น่ากลัวในการตีความ SVG" ฉันไม่ต้องการให้ png ของฉันดูน่ากลัวดังนั้นฉันจึงถามคำถามนี้อีกครั้ง
ram1


ตัวอย่างในลิงค์นั้นเฉพาะสำหรับ Win32 ฉันใช้ลินุกซ์
ram1

ดูโพสต์บล็อกนี้ดูเหมือนว่าอาจเป็นสิ่งที่คุณต้องการ
giodamelio

คำตอบ:


61

คำตอบคือ " pyrsvg " - หลามผูกพันlibrsvg

มีแพ็คเกจ Ubuntu python-rsvgให้ การค้นหาชื่อ Google ไม่ดีเนื่องจากซอร์สโค้ดดูเหมือนว่าจะอยู่ในที่เก็บ GIT โปรเจ็กต์ Gnome "gnome-python-desktop"

ฉันสร้าง "สวัสดีชาวโลก" แบบเรียบง่ายที่แสดง SVG เป็นพื้นผิวไคโรและเขียนลงในดิสก์:

import cairo
import rsvg

img = cairo.ImageSurface(cairo.FORMAT_ARGB32, 640,480)

ctx = cairo.Context(img)

## handle = rsvg.Handle(<svg filename>)
# or, for in memory SVG data:
handle= rsvg.Handle(None, str(<svg data>))

handle.render_cairo(ctx)

img.write_to_png("svg.png")

ปรับปรุง : เป็นของ 2014 แพคเกจที่จำเป็นสำหรับการกระจาย Fedora Linux gnome-python2-rsvgเป็น: รายการข้อมูลโค้ดด้านบนยังคงใช้งานได้ตามเดิม


1
เยี่ยมมากใช้งานได้ดี แต่มีวิธีcairoกำหนดความสูงและความกว้างของภาพด้วยตัวเองหรือไม่? ฉันได้ตรวจสอบ*.svgไฟล์เพื่อแยก HEIGHT และ WIDTH จากที่นั่น แต่ทั้งสองตั้งค่าเป็น100%. แน่นอนฉันสามารถตรวจสอบคุณสมบัติของภาพได้ แต่เนื่องจากนี่เป็นเพียงขั้นตอนเดียวในการประมวลผลภาพจึงไม่ใช่สิ่งที่ฉันต้องการ
quapka

1
หาก "ความกว้าง" และ "ความสูง" ของไฟล์ของคุณตั้งไว้ที่ 100% จะไม่มีเวทมนตร์ไคโรหรือ rsvg ที่สามารถคาดเดาขนาดได้ไฟล์ SVG ดังกล่าวถูกปล่อยให้มีขนาดโดยไม่ขึ้นกับซอฟต์แวร์ของผู้สร้าง (/ คน) โค้ด HTML ที่อยู่รอบ ๆ เพื่อนำเข้าไฟล์ SVG จะให้ขนาดจริง อย่างไรก็ตามออบเจ็กต์ "Handle" ของ rsvg มี.get_dimension_data()วิธีการที่ใช้ได้กับไฟล์ตัวอย่างของฉัน (SVG ที่ทำงานได้ดี) - ลองดูสิ
jsbueno

1
ณ ปี 2014 สำหรับ ubuntu คุณสามารถใช้: apt-get install python-rsvg
t1m0

1
มีคำสั่งด่วนสำหรับการเพิ่มพื้นหลังสีขาวให้กับรูปภาพหรือไม่หากพื้นหลังปัจจุบันโปร่งใส
fiatjaf

@jsbueno ฉันใช้ Windows 8.1 และ python 2.7.11 ฉันจะติดตั้ง cairo และ rsvg และทำให้มันใช้งานได้อย่างไร ฉันกำลังดิ้นรนเพื่อทำงานนี้ BTW +1 สำหรับคำอธิบายโดยละเอียดของคุณ
Marlon Abeykoon

89

นี่คือสิ่งที่ฉันใช้cairosvg :

from cairosvg import svg2png

svg_code = """
    <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
        <circle cx="12" cy="12" r="10"/>
        <line x1="12" y1="8" x2="12" y2="12"/>
        <line x1="12" y1="16" x2="12" y2="16"/>
    </svg>
"""

svg2png(bytestring=svg_code,write_to='output.png')

และทำงานได้อย่างมีเสน่ห์!

ดูเพิ่มเติม: เอกสาร cairosvg


5
สวัสดี. คุณรู้หรือไม่ว่าฉันจะทำเช่นเดียวกัน แต่ไม่เขียนลงในไฟล์ได้อย่างไร? ฉันต้องการพุชเนื้อหา png ไปยังเบราว์เซอร์จากเว็บเซิร์ฟเวอร์เพื่อให้ผู้ใช้สามารถดาวน์โหลดภาพได้ การบันทึกไฟล์ png ไม่ใช่ตัวเลือกที่ถูกต้องในโครงการของเรานั่นเป็นเหตุผลว่าทำไมฉันถึงต้องการมัน ขอบคุณ
estemendoza

4
ฉันทำสิ่งนี้ด้วยตัวเอง โดยพื้นฐานแล้วขึ้นอยู่กับเครื่องมือหรือเฟรมเวิร์กที่คุณมีอยู่ในมือเมื่อจัดการกับคำขอเว็บของคุณ แต่ไม่ว่าจะเป็นอะไรก็ตามแนวคิดพื้นฐานคือsvg2pngใช้ในstreamออบเจ็กต์ในwrite_toพารามิเตอร์และสิ่งนี้อาจเป็นอ็อบเจ็กต์การตอบสนอง HTTP ของคุณ (ซึ่งใน เฟรมเวิร์กส่วนใหญ่เป็นอ็อบเจ็กต์ที่มีลักษณะคล้ายไฟล์) หรือสตรีมอื่น ๆ ซึ่งคุณจะใช้กับเบราว์เซอร์โดยใช้Content-Dispositionส่วนหัว ดูที่นี่: stackoverflow.com/questions/1012437/…
nemesisfixx

4
สำหรับผู้ที่ประสบปัญหาเกี่ยวกับรหัสนั้นเช่นเดียวกับฉัน: 1). bytestringยอมรับไบต์ดังนั้นให้แปลงสตริงก่อนด้วยbytestring=bytes(svg,'UTF-8') 2) โหมดไฟล์ควรเป็นไบนารีดังนั้นopen('output.png','wb')
Serj Zaharchenko

3
cairosvg รองรับเฉพาะ Python 3.4+ พวกเขายกเลิกการสนับสนุน Python 2
Marlon Abeykoon

1
มีไม่สำหรับผมแล้วผมต้องใช้svg2png cairosvg.surface.PNGSurface.convert(svg_str, write_to='output.png')
tobltobs

39

ติดตั้ง Inkscape และเรียกมันว่าบรรทัดคำสั่ง:

${INKSCAPE_PATH} -z -f ${source_svg} -w ${width} -j -e ${dest_png}

คุณยังสามารถสแน็ปพื้นที่สี่เหลี่ยมเฉพาะโดยใช้พารามิเตอร์-jเช่นการประสาน "0: 125: 451: 217"

${INKSCAPE_PATH} -z -f ${source_svg} -w ${width} -j -a ${coordinates} -e ${dest_png}

หากคุณต้องการแสดงเพียงวัตถุเดียวในไฟล์ SVG คุณสามารถระบุพารามิเตอร์-iด้วยรหัสวัตถุที่คุณตั้งค่าไว้ใน SVG มันซ่อนทุกสิ่งทุกอย่าง

${INKSCAPE_PATH} -z -f ${source_svg} -w ${width} -i ${object} -j -a ${coordinates} -e ${dest_png}

2
+1 เนื่องจากสิ่งนี้มีประโยชน์อย่างยิ่งสำหรับการเขียนสคริปต์เชลล์ ดูinkscape.org/doc/inkscape-man.htmlสำหรับเอกสารฉบับเต็มในบรรทัดคำสั่งของ Inkscape
นายก

ขอบคุณนี่เป็นวิธีที่ง่ายที่สุดที่ฉันพบในการทำเช่นนี้ ใน Windows เพื่อให้คุณไม่ต้องพิมพ์เส้นทางแบบเต็มไปยัง Inkscape ทุกครั้งคุณสามารถเพิ่มลงในเส้นทางของคุณในตัวแปรสภาพแวดล้อมได้
Alex S

3
นี่ไม่ใช่คำตอบ มันเป็นวิธีแก้ปัญหา OP ขอวิธีแก้ปัญหา Python
lamino

31

ฉันใช้Wand-py (การใช้งาน Wand wrapper รอบ ๆ ImageMagick) เพื่อนำเข้า SVG ขั้นสูงที่ค่อนข้างสูงและจนถึงตอนนี้ก็ได้เห็นผลลัพธ์ที่ยอดเยี่ยม! นี่คือรหัสทั้งหมดที่ต้องใช้:

    with wand.image.Image( blob=svg_file.read(), format="svg" ) as image:
        png_image = image.make_blob("png")

ฉันเพิ่งค้นพบสิ่งนี้ในวันนี้และรู้สึกว่ามันคุ้มค่าที่จะแบ่งปันให้กับคนอื่น ๆ ที่อาจข้ามผ่านคำตอบนี้เนื่องจากเป็นเวลานานแล้วเนื่องจากคำถามเหล่านี้ส่วนใหญ่ได้รับคำตอบ

หมายเหตุ:ในทางเทคนิคในการทดสอบฉันพบว่าคุณไม่จำเป็นต้องผ่านพารามิเตอร์รูปแบบสำหรับ ImageMagick with wand.image.Image( blob=svg_file.read() ) as image:ด้วยซ้ำดังนั้น สิ่งที่จำเป็นจริงๆ

แก้ไข: จากการพยายามแก้ไขโดย qris ต่อไปนี้เป็นโค้ดที่มีประโยชน์ซึ่งช่วยให้คุณใช้ ImageMagick กับ SVG ที่มีพื้นหลังโปร่งใส:

from wand.api import library
import wand.color
import wand.image

with wand.image.Image() as image:
    with wand.color.Color('transparent') as background_color:
        library.MagickSetBackgroundColor(image.wand, 
                                         background_color.resource) 
    image.read(blob=svg_file.read(), format="svg")
    png_image = image.make_blob("png32")

with open(output_filename, "wb") as out:
    out.write(png_image)

2
ไม้กายสิทธิ์ทำงานมากดีกว่าไคโร PNGs ของฉัน
qris

3
ฉันได้รับข้อผิดพลาด image.read(blob=svg_file.read(), format="svg") NameError: name 'svg_file' is not defined
adrienlucca.wordpress.com

2
svg_fileถือว่าเป็นวัตถุ "ไฟล์" ในตัวอย่างนี้การตั้งค่าsvg_fileจะมีลักษณะดังนี้:svg_file = File.open(file_name, "r")
streetlogics

2
ขอบคุณวิธีการcairoและrsvg'ยอมรับ' ใช้ไม่ได้กับ PDF ของฉัน pip install wandและตัวอย่างข้อมูลของคุณก็ใช้เคล็ดลับ;)
nmz787

5
หากคุณมี SVG แล้วคุณจะต้องแรกที่จะเข้ารหัสลงในไบนารีเช่นนี้str svg_blob = svg_str.encode('utf-8')ตอนนี้คุณสามารถใช้วิธีการด้านบนโดยแทนที่blob=svg_file.read()ด้วยblob=svg_blob.
asherbar

12

ลองสิ่งนี้: http://cairosvg.org/

เว็บไซต์กล่าวว่า:

CairoSVG เขียนด้วย python บริสุทธิ์และขึ้นอยู่กับ Pycairo เท่านั้น เป็นที่ทราบกันดีว่าทำงานบน Python 2.6 และ 2.7

อัปเดต 25 พฤศจิกายน 2559 :

2.0.0 เป็นเวอร์ชันหลักใหม่บันทึกการเปลี่ยนแปลงประกอบด้วย:

  • วางการสนับสนุน Python 2

มีปัญหาสองประการในเรื่องนี้ขออภัย ประการแรกมันไม่ได้จัดการกับไฟล์<clipPath><rect ... /></clipPath>. ประการที่สองไม่ใช้ตัวเลือก -d (DPI)
Ray

2
@Ray โปรดส่งรายงานข้อผิดพลาด / คำขอคุณสมบัติบนตัวติดตาม CairoSVG !
Simon Sapin

@Simon คุณทำได้มั้ย? ฉันยุ่งมากและฉันจะอยู่ใน 1-2 เดือนข้างหน้า
Ray

2
@Ray จริงๆแล้วตัวเลือก -d / --dpi มีมาระยะหนึ่งแล้วและฉันได้รับแจ้งว่ามีการเพิ่มการสนับสนุนสำหรับ <clippath> เมื่อไม่กี่สัปดาห์ที่ผ่านมาในเวอร์ชันคอมไพล์
Simon Sapin

@ ไซม่อนดี! ขอบคุณ! :)
Ray

6

อีกวิธีหนึ่งที่ฉันเพิ่งพบที่นี่จะแสดง SVG ที่ปรับขนาดเป็น QImage ได้อย่างไร

from PySide.QtSvg import *
from PySide.QtGui import *


def convertSvgToPng(svgFilepath,pngFilepath,width):
    r=QSvgRenderer(svgFilepath)
    height=r.defaultSize().height()*width/r.defaultSize().width()
    i=QImage(width,height,QImage.Format_ARGB32)
    p=QPainter(i)
    r.render(p)
    i.save(pngFilepath)
    p.end()

PySide สามารถติดตั้งได้อย่างง่ายดายจากแพ็คเกจไบนารีใน Windows (และฉันใช้มันเพื่อสิ่งอื่น ๆ มันง่ายสำหรับฉัน)

อย่างไรก็ตามฉันสังเกตเห็นปัญหาเล็กน้อยเมื่อแปลงธงประเทศจาก Wikimedia ดังนั้นอาจไม่ใช่ตัวแยกวิเคราะห์ / ตัวแสดงผล svg ที่มีประสิทธิภาพมากที่สุด


5

ส่วนขยายเล็กน้อยเกี่ยวกับคำตอบของ jsbueno:

#!/usr/bin/env python

import cairo
import rsvg
from xml.dom import minidom


def convert_svg_to_png(svg_file, output_file):
    # Get the svg files content
    with open(svg_file) as f:
        svg_data = f.read()

    # Get the width / height inside of the SVG
    doc = minidom.parse(svg_file)
    width = int([path.getAttribute('width') for path
                 in doc.getElementsByTagName('svg')][0])
    height = int([path.getAttribute('height') for path
                  in doc.getElementsByTagName('svg')][0])
    doc.unlink()

    # create the png
    img = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
    ctx = cairo.Context(img)
    handler = rsvg.Handle(None, str(svg_data))
    handler.render_cairo(ctx)
    img.write_to_png(output_file)

if __name__ == '__main__':
    from argparse import ArgumentParser

    parser = ArgumentParser()

    parser.add_argument("-f", "--file", dest="svg_file",
                        help="SVG input file", metavar="FILE")
    parser.add_argument("-o", "--output", dest="output", default="svg.png",
                        help="PNG output file", metavar="FILE")
    args = parser.parse_args()

    convert_svg_to_png(args.svg_file, args.output)

ฉันใช้การแยกความกว้างและความสูง svg ฉันไม่แน่ใจเกี่ยวกับมาตรฐาน svg แต่ในไฟล์ svg บางไฟล์ความกว้างหรือความสูงตามด้วยสตริงที่ไม่ใช่ตัวเลขเช่น 'mm' หรือ 'px' (เช่น '250mm') int ('250 มม.') มีข้อยกเว้นและฉันต้องทำการปรับแต่งเพิ่มเติม
WigglyWorld

5

ฉันไม่พบคำตอบที่น่าพอใจ ไลบรารีที่กล่าวถึงทั้งหมดมีปัญหาบางอย่างหรืออื่น ๆ เช่นไคโรลดการรองรับ python 3.6 (พวกเขาทิ้ง Python 2 รองรับเมื่อ 3 ปีก่อน!) นอกจากนี้การติดตั้งไลบรารีที่กล่าวถึงบน Mac ก็เป็นความเจ็บปวด

สุดท้ายผมพบว่าวิธีการแก้ปัญหาที่ดีที่สุดคือsvglib + ReportLab ทั้งสองติดตั้งโดยไม่มีปัญหาโดยใช้ pip และการโทรครั้งแรกเพื่อแปลงจาก svg เป็น png ทำงานได้อย่างสวยงาม มีความสุขมากกับการแก้ปัญหา

เพียง 2 คำสั่งทำเคล็ดลับ:

from svglib.svglib import svg2rlg
from reportlab.graphics import renderPM
drawing = svg2rlg("my.svg")
renderPM.drawToFile(drawing, "my.png", fmt="PNG")

มีข้อ จำกัด ใด ๆ ที่ฉันควรทราบหรือไม่?


ใช่ไม่รองรับ marker-end และจะไม่เป็นเช่นนั้นgithub.com/deeplook/svglib/issues/177
Rainald62

2

การปรับขนาด SVG และการเรนเดอร์ PNG

การใช้pycairoและlibrsvgฉันสามารถปรับขนาด SVG และแสดงผลเป็นบิตแมปได้ สมมติว่า SVG ของคุณไม่ใช่ 256x256 พิกเซลซึ่งเป็นผลลัพธ์ที่ต้องการคุณสามารถอ่านใน SVG เป็นบริบทไคโรโดยใช้ rsvg จากนั้นปรับขนาดและเขียนเป็น PNG

main.py

import cairo
import rsvg

width = 256
height = 256

svg = rsvg.Handle('cool.svg')
unscaled_width = svg.props.width
unscaled_height = svg.props.height

svg_surface = cairo.SVGSurface(None, width, height)
svg_context = cairo.Context(svg_surface)
svg_context.save()
svg_context.scale(width/unscaled_width, height/unscaled_height)
svg.render_cairo(svg_context)
svg_context.restore()

svg_surface.write_to_png('cool.png')

RSVG C ผูกพัน

จากเว็บไซต์ Cario ที่มีการปรับเปลี่ยนเล็กน้อย นอกจากนี้ยังเป็นตัวอย่างที่ดีในการเรียก C-library จาก Python

from ctypes import CDLL, POINTER, Structure, byref, util
from ctypes import c_bool, c_byte, c_void_p, c_int, c_double, c_uint32, c_char_p


class _PycairoContext(Structure):
    _fields_ = [("PyObject_HEAD", c_byte * object.__basicsize__),
                ("ctx", c_void_p),
                ("base", c_void_p)]


class _RsvgProps(Structure):
    _fields_ = [("width", c_int), ("height", c_int),
                ("em", c_double), ("ex", c_double)]


class _GError(Structure):
    _fields_ = [("domain", c_uint32), ("code", c_int), ("message", c_char_p)]


def _load_rsvg(rsvg_lib_path=None, gobject_lib_path=None):
    if rsvg_lib_path is None:
        rsvg_lib_path = util.find_library('rsvg-2')
    if gobject_lib_path is None:
        gobject_lib_path = util.find_library('gobject-2.0')
    l = CDLL(rsvg_lib_path)
    g = CDLL(gobject_lib_path)
    g.g_type_init()

    l.rsvg_handle_new_from_file.argtypes = [c_char_p, POINTER(POINTER(_GError))]
    l.rsvg_handle_new_from_file.restype = c_void_p
    l.rsvg_handle_render_cairo.argtypes = [c_void_p, c_void_p]
    l.rsvg_handle_render_cairo.restype = c_bool
    l.rsvg_handle_get_dimensions.argtypes = [c_void_p, POINTER(_RsvgProps)]

    return l


_librsvg = _load_rsvg()


class Handle(object):
    def __init__(self, path):
        lib = _librsvg
        err = POINTER(_GError)()
        self.handle = lib.rsvg_handle_new_from_file(path.encode(), byref(err))
        if self.handle is None:
            gerr = err.contents
            raise Exception(gerr.message)
        self.props = _RsvgProps()
        lib.rsvg_handle_get_dimensions(self.handle, byref(self.props))

    def get_dimension_data(self):
        svgDim = self.RsvgDimensionData()
        _librsvg.rsvg_handle_get_dimensions(self.handle, byref(svgDim))
        return (svgDim.width, svgDim.height)

    def render_cairo(self, ctx):
        """Returns True is drawing succeeded."""
        z = _PycairoContext.from_address(id(ctx))
        return _librsvg.rsvg_handle_render_cairo(self.handle, z.ctx)

ขอบคุณสำหรับสิ่งนี้มันพิสูจน์แล้วว่ามีประโยชน์มากในโครงการของฉัน แม้ว่าจะHandle.get_dimension_dataไม่ได้ผลสำหรับฉัน ฉันต้องแทนที่ด้วยการดึงself.props.widthและself.props.height. ครั้งแรกฉันพยายามกำหนดRsvgDimensionDataโครงสร้างตามที่อธิบายไว้ในเว็บไซต์ cairo แต่ไม่ประสบความสำเร็จ
JeanOlivier

ฉันกำลังพยายามใช้สิ่งนี้ในโครงการของฉัน ฉันจะรับไฟล์ dll ที่ต้องการได้อย่างไร?
Andoo

0

นี่คือวิธีการที่ Python เรียก Inkscape

โปรดทราบว่าจะระงับเอาต์พุตที่สำคัญบางอย่างที่ Inkscape เขียนลงในคอนโซล (โดยเฉพาะ stderr และ stdout) ในระหว่างการดำเนินการที่ปราศจากข้อผิดพลาดตามปกติ เอาต์พุตถูกจับในตัวแปรสตริงสองตัวoutและerr.

import subprocess               # May want to use subprocess32 instead

cmd_list = [ '/full/path/to/inkscape', '-z', 
             '--export-png', '/path/to/output.png',
             '--export-width', 100,
             '--export-height', 100,
             '/path/to/input.svg' ]

# Invoke the command.  Divert output that normally goes to stdout or stderr.
p = subprocess.Popen( cmd_list, stdout=subprocess.PIPE, stderr=subprocess.PIPE )

# Below, < out > and < err > are strings or < None >, derived from stdout and stderr.
out, err = p.communicate()      # Waits for process to terminate

# Maybe do something with stdout output that is in < out >
# Maybe do something with stderr output that is in < err >

if p.returncode:
    raise Exception( 'Inkscape error: ' + (err or '?')  )

ตัวอย่างเช่นเมื่อเรียกใช้งานเฉพาะบนระบบ Mac OS ของฉันoutจะกลายเป็น:

Background RRGGBBAA: ffffff00
Area 0:0:339:339 exported to 100 x 100 pixels (72.4584 dpi)
Bitmap saved as: /path/to/output.png

(ไฟล์ svg อินพุตมีขนาด 339 x 339 พิกเซล)


ไม่ใช่ Python แบบ end-to-end หากคุณใช้ Inkscape
Joel

1
@ Joel: บรรทัดแรกได้รับการแก้ไขเพื่อเอาชนะการคัดค้านของคุณ แต่แน่นอนว่าแม้แต่โซลูชัน Python ที่ "บริสุทธิ์" ก็ต้องอาศัยองค์ประกอบนอกภาษาหลักและในที่สุดก็ทำงานด้วยภาษาเครื่องดังนั้นอาจไม่มีสิ่งที่เรียกว่า end-to-end อะไรเลย!
หมอนเหล็ก

0

อันที่จริงฉันไม่ต้องการพึ่งพาสิ่งอื่นใดนอกจาก Python (Cairo, Ink .. ฯลฯ ) ความต้องการของฉันคือต้องเรียบง่ายที่สุดเท่าที่pip install "savior"จะทำได้ง่ายที่สุดก็พอเพียงนั่นคือเหตุผลที่ข้อใดข้อหนึ่งข้างต้นไม่ t เหมาะสำหรับฉัน

ฉันมาถึงสิ่งนี้ (ไปไกลกว่า Stackoverflow ในการวิจัย) https://www.tutorialexample.com/best-practice-to-python-convert-svg-to-png-with-svglib-python-tutorial/

ดูดีจังเลย เลยเอามาแบ่งปันเผื่อว่าใครอยู่ในสถานการณ์เดียวกัน


คุณช่วยระบุส่วนที่เกี่ยวข้องของบทความนั้นในคำตอบของคุณได้ไหม
Ciprian Tomoiagă

ดูแล้วดูเหมือนว่าจะเหมือนกับคำตอบของซารัง
Ciprian Tomoiagă
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.