2016-06-08 94 views
-1

我想用PNG圖像轉換爲SVG,但是當我運行這個代碼輸出圖像甚至無法加載到Photoshop或瀏覽器。我究竟做錯了什麼?PNG到SVG Python

import os 
    import base64 
    startSvgTag = """<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
    <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
    "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
    <svg version="1.1" 
    xmlns="http://www.w3.org/2000/svg" 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    width="240px" height="240px" viewBox="0 0 240 240">""" 

    endSvgTag = """</svg>""" 
    for files in os.listdir("."): 
     if files.endswith(".png"): 
      pngFile = open(files, 'rb') 
      base64data = base64.b64encode(pngFile.read()).replace(b'\n',b'') 
      base64String = '<image xlink:href="data:image/png;base64,{0}" width="240" height="240" x="0" y="0" />'.format(base64data) 
      f = open(os.path.splitext(files)[0]+".svg",'w') 
      f.write(startSvgTag + base64String + endSvgTag) 
      print('Converted ',files,' to ',os.path.splitext(files)[0],".svg") 
+2

'PNG'文件是位圖,'SVG'是矢量文件,它們不是一回事。您不能通過重命名文件來轉換文件。這與'Base64'對'.doc'文件進行編碼並將其重命名爲'.xls'並期望Excel將其作爲電子表格打開一樣。 –

+0

你有什麼建議,我應該如何將PNG轉換爲SVG? – user47823

+2

@ user47823爲什麼? SVG是一種矢量格式,PNG是一種位圖格式。是否有特定的原因需要SVG格式?在SVG中嵌入PNG時,SVG的優勢都不會出現。值得注意的是,Python中有[vectorization]方法(https://stackoverflow.com/questions/15891158/vectorizing-photos-finding-an-adapted-algorithm),以及[Inkscape](http:// goinkscape.com/how-to-vectorize-in-inkscape/)。 – Kupiakos

回答

0

如果您只是希望解決您的代碼,刪除.replace(b'\n',b'')和改變.format(base64data).format(base64data.decode('utf-8'))

如果base64數據是IVBoR32==,它將在Python 3中表示爲b'IVBoR32=='。當你在做.format(base64data)時,圖片元素變成<image xlink:href="data:image/png;base64,b'IVBoR32=='" width="240" height="240" x="0" y="0" />,這是不正確的。基本上,您需要將base64數據轉換爲format之前的str

+0

這可行,但這不是我想要做的。我認爲我對SVG有完全錯誤的理解。我試圖將像素化PNG轉換爲「平滑」SVG。 – user47823