2016-06-08 7 views
-1

Я пытаюсь преобразовать PNG-изображения в SVG с помощью Python, но когда я запускаю этот код, выходное изображение не может даже загружаться в Photoshop или в браузере. Что я делаю не так?PNG to 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. Было отмечено, что существуют методы [векторизации] (https://stackoverflow.com/questions/15891158/vectorizing-photos-finding-an-adapted-algorithm) в Python, а также в [Inkscape] (http: // goinkscape.com/how-to-vectorize-in-inkscape/). – Kupiakos

ответ

0

Если вы просто хотите, чтобы исправить свой код, удалить .replace(b'\n',b'') и изменить .format(base64data) в .format(base64data.decode('utf-8')).

Если base64data были 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 в str перед format.

+0

Это работает, но это не то, что я пытаюсь сделать. Я думаю, что у меня совершенно неправильное понимание SVG. Я пытался конвертировать пикселированный PNG в «гладкий» SVG. – user47823

Смежные вопросы