2013-03-10 3 views
1

다음 코드를 사용하여 일부 SVG를 PNG 데이터로 렌더링하는 데 문제가 있습니다. 이미지가 궁극적으로 HTTP 응답 본문으로 사용되기 때문에 StringIO 작성기가 사용됩니다.pyrsvg와 Cairo를 사용하여 Python에서 SVG 렌더링 렌더링

결과가 올바른 크기의 PNG이지만 완전히 투명합니다.

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
    <!-- Created with Inkscape (http://www.inkscape.org/) --> 

<svg 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:cc="http://creativecommons.org/ns#" 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns:svg="http://www.w3.org/2000/svg" 
    xmlns="http://www.w3.org/2000/svg" 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    version="1.1" 
    width="40" 
    height="40" 
    id="svg2"> 
    <defs 
     id="defs4"> 
     <linearGradient 
     id="linearGradient3769"> 
     <stop 
      id="stop3771" 
      style="stop-color:#ffffff;stop-opacity:1" 
      offset="0" /> 
     <stop 
      id="stop3773" 
      style="stop-color:#000000;stop-opacity:1" 
      offset="1" /> 
     </linearGradient> 
     <radialGradient 
     cx="13.895907" 
     cy="15.277355" 
     r="19.6875" 
     fx="13.895907" 
     fy="15.277355" 
     id="radialGradient3775" 
     xlink:href="#linearGradient3769" 
     gradientUnits="userSpaceOnUse" 
     gradientTransform="matrix(0.96746783,-0.96746783,0.95701248,0.95701249,-12.884457,12.690532)" /> 
    </defs> 
    <metadata 
     id="metadata7"> 
     <rdf:RDF> 
     <cc:Work 
      rdf:about=""> 
      <dc:format>image/svg+xml</dc:format> 
      <dc:type 
      rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> 
      <dc:title></dc:title> 
     </cc:Work> 
     </rdf:RDF> 
    </metadata> 
    <g 
     transform="translate(0,-1012.3622)" 
     id="layer1"> 
     <path 
      d="m 39.375,19.776785 a 19.6875,19.6875 0 1 1 -39.375,0 19.6875,19.6875 0 1 1 39.375,0 z" 
      transform="matrix(1.015873,0,0,1.015873,0,1012.2715)" 
      id="path2991" 
      style="fill:url(#radialGradient3775);fill-opacity:1;fill-rule:nonzero;stroke:none" /> 
    </g> 
</svg> 

답변

1

여기에 나를 위해 괜찮 작품 :

import rsvg 
import cairo 
import StringIO 

def render_svg_to_png(svg_data): 
    # Render 
    svg = rsvg.Handle(data=svg_data) 
    img = cairo.ImageSurface(cairo.FORMAT_ARGB32, 
     svg.props.width, 
     svg.props.height) 
    ctx = cairo.Context(img) 
    svg.render_cairo(ctx) 

    # Write to StringIO 
    png_io = StringIO.StringIO() 
    img.write_to_png(png_io) 

    return png_io.getvalue() 

svg_data = open('test.svg', 'r').read() 
print render_svg_to_png(svg_data) 

.png 파일로 출력 리디렉션을 실행하고이 와서 확인 다음과 같이
import rsvg 
import cairo 
import StringIO 

def render_svg_to_png(svg_data): 
    # Render 
    svg = rsvg.Handle() 
    svg.write(buffer=svg_data) 

    img = cairo.ImageSurface(cairo.FORMAT_ARGB32, 
          svg.props.width, 
          svg.props.height) 
    ctx = cairo.Context(img) 
    svg.render_cairo(ctx) 

    # Write to StringIO 
    png_io = StringIO.StringIO() 
    img.write_to_png(png_io) 
    img.finish() 

    return png_io.getvalue() 

렌더링되는 SVG 데이터

입니다 좋아, 이미지보기 프로그램.

+0

실제로 문제는 ElementTree를 사용하여 XML을 수정하는 것과 관련이 있습니다. ET의 XML 출력에는 네임 스페이스가 엉망이었다. 이 코드를 테스트 할 때 사용하던 Chrome에는 문제가 없었지만 rsvg를 화나게하는 것 같습니다. ET에서 출력물을 더 자세히 살펴볼 때까지이 사실을 알지 못했습니다. minidom으로 전환하면이 문제가 해결되었습니다. – dlp

관련 문제