2009-07-07 5 views
1

Gibt es eine Möglichkeit, die Neuskalierung eines .SVG von seiner aktuellen Größe (Tausende von Pixeln) zu einer viel kleineren Größe zu skripten? Ich habe ImageMagick ausprobiert, aber die Unterstützung für SVG-Gradienten ist viel zu schwach, um nützlich zu sein.Gibt es ein Skript zum Ändern der Größe von SVG?

Der Zweck ist es, einen Fehler in einer Rendering-Bibliothek zu umgehen, die SVGs mit großen Pixelgrößen manchmal dazu bringt, große Raster zuzuweisen (bevor sie schließlich für die eigentliche Anzeige glatt skaliert werden).

Zum Beispiel, wie kann ich diese 1024x1024px svg ändern:

<?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" 
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" 
    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" 
    width="1024.09" 
    height="1024.36" 
    id="svg2" 
    sodipodi:version="0.32" 
    inkscape:version="0.46" 
    version="1.0" 
    sodipodi:docname="tst.svg" 
    inkscape:output_extension="org.inkscape.output.svg.inkscape"> 
    <defs 
    id="defs4"> 
    <linearGradient 
     inkscape:collect="always" 
     id="linearGradient2454"> 
     <stop 
     style="stop-color:#800000;stop-opacity:1;" 
     offset="0" 
     id="stop2456" /> 
     <stop 
     style="stop-color:#800000;stop-opacity:0;" 
     offset="1" 
     id="stop2458" /> 
    </linearGradient> 
    <inkscape:perspective 
     sodipodi:type="inkscape:persp3d" 
     inkscape:vp_x="99.717407 : 889.90313 : 1" 
     inkscape:vp_y="7.5659029e-15 : 92.21017 : 0" 
     inkscape:vp_z="191.66118 : 889.90313 : 1" 
     inkscape:persp3d-origin="145.68929 : 873.73005 : 1" 
     id="perspective10" /> 
    <radialGradient 
     inkscape:collect="always" 
     xlink:href="#linearGradient2454" 
     id="radialGradient2460" 
     cx="4022.8572" 
     cy="5451.2656" 
     fx="4022.8572" 
     fy="5451.2656" 
     r="3559.865" 
     gradientTransform="matrix(-0.1071067,-0.1166362,0.1377765,-7.0459663e-2,276.61943,1452.439)" 
     gradientUnits="userSpaceOnUse" /> 
    </defs> 
    <sodipodi:namedview 
    id="base" 
    pagecolor="#ffffff" 
    bordercolor="#666666" 
    borderopacity="1.0" 
    gridtolerance="10000" 
    guidetolerance="10" 
    objecttolerance="10" 
    inkscape:pageopacity="0.0" 
    inkscape:pageshadow="2" 
    inkscape:zoom="0.49497475" 
    inkscape:cx="403.89421" 
    inkscape:cy="477.41913" 
    inkscape:document-units="px" 
    inkscape:current-layer="layer1" 
    showgrid="false" 
    inkscape:window-width="1680" 
    inkscape:window-height="978" 
    inkscape:window-x="1307" 
    inkscape:window-y="24" /> 
    <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" /> 
     </cc:Work> 
    </rdf:RDF> 
    </metadata> 
    <g 
    inkscape:label="Layer 1" 
    inkscape:groupmode="layer" 
    id="layer1"> 
    <rect 
     style="fill:#0000ff;fill-rule:evenodd;stroke:#000000;stroke-width:0.10674229px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" 
     id="rect2403" 
     width="836.00311" 
     height="815.66479" 
     x="144.90677" 
     y="154.41733" /> 
    <path 
     style="fill:url(#radialGradient2460);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.10674229px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" 
     d="M 492.29996,1003.8047 C 992.20722,1001.6971 989.38289,999.5894 992.20722,997.48173 C 995.03156,995.37408 992.20722,124.91007 992.20722,124.91007 L 113.83908,124.91007 L 122.31209,1012.2353 L 492.29996,1003.8047 z" 
     id="path2382" /> 
    <g 
     sodipodi:type="inkscape:box3d" 
     style="fill:#800000;fill-opacity:1" 
     id="g2392" 
     inkscape:perspectiveID="#perspective10" 
     inkscape:corner0="-0.94081067 : 0.17266027 : 0 : 1" 
     inkscape:corner7="-0.94348241 : 0.15857352 : 0.25 : 1"> 
     <path 
     sodipodi:type="inkscape:box3dside" 
     id="path2402" 
     style="fill:#afafde;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" 
     inkscape:box3dsidetype="13" 
     d="M 876.40947,160.66071 L 913.12582,161.89944 L 324.68925,139.51689 L 322.74524,139.47316 L 876.40947,160.66071 z" /> 
     <path 
     sodipodi:type="inkscape:box3dside" 
     id="path2400" 
     style="fill:#d7d7ff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" 
     inkscape:box3dsidetype="14" 
     d="M 913.12582,138.91648 L 913.12582,161.89944 L 324.68925,139.51689 L 324.68925,135.27915 L 913.12582,138.91648 z" /> 
     <path 
     sodipodi:type="inkscape:box3dside" 
     id="path2404" 
     style="fill:#e9e9ff;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" 
     inkscape:box3dsidetype="11" 
     d="M 322.74524,135.27204 L 324.68925,135.27915 L 324.68925,139.51689 L 322.74524,139.47316 L 322.74524,135.27204 z" /> 
     <path 
     sodipodi:type="inkscape:box3dside" 
     id="path2396" 
     style="fill:#4d4d9f;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" 
     inkscape:box3dsidetype="5" 
     d="M 876.40947,138.71518 L 913.12582,138.91648 L 324.68925,135.27915 L 322.74524,135.27204 L 876.40947,138.71518 z" /> 
     <path 
     sodipodi:type="inkscape:box3dside" 
     id="path2394" 
     style="fill:#353564;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" 
     inkscape:box3dsidetype="6" 
     d="M 876.40947,138.71518 L 876.40947,160.66071 L 322.74524,139.47316 L 322.74524,135.27204 L 876.40947,138.71518 z" /> 
     <path 
     sodipodi:type="inkscape:box3dside" 
     id="path2398" 
     style="fill:#8686bf;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" 
     inkscape:box3dsidetype="3" 
     d="M 876.40947,138.71518 L 913.12582,138.91648 L 913.12582,161.89944 L 876.40947,160.66071 L 876.40947,138.71518 z" /> 
    </g> 
    <rect 
     style="fill:#800000;fill-opacity:1" 
     id="rect2448" 
     width="36.716354" 
     height="14.753627" 
     x="432.98892" 
     y="103.83346" /> 
    <rect 
     style="fill:#800000;fill-opacity:1" 
     id="rect2450" 
     width="22.594679" 
     height="16.861288" 
     x="133.60942" 
     y="101.7258" /> 
    <rect 
     style="fill:#800000;fill-opacity:1" 
     id="rect2452" 
     width="22.594679" 
     height="6.3229828" 
     x="949.84222" 
     y="97.510475" /> 
    </g> 
</svg> 

Zu einer 102.4x102.4 SVG? Es wäre schön, wenn es nicht auch Teile des SVG fallen lassen würde (was libsvgbin2 ausschließt, obwohl es nahe kommt).

+2

was meinst du mit „ein SVG Größe ändern“? Da es sich um eine vektorielle Beschreibung handelt (das S ist für "Skalierbar"), gibt es keine reale Größe in Pixeln ... Wenn Sie beispielsweise die Größe (in Pixel) einer SVG-Anzeige in einem Browser ändern möchten, Sie können nur die Eigenschaften "width" und "length" des Elements ändern. – ThibThib

+0

@ThibThib - Mit Größe ändern, ich meine die Größenhöhe, Breite und Viewbox-Attribute im Wurzelelement sowie die Koordinatenparameter für alle ändern die Gruppen/Pfade innerhalb der Svg. Eine bloße clientseitige Übersetzung wird nicht funktionieren, da die fragliche Bibliothek eine pathologische Interaktion mit Java 1.5.0_19 auf OSX hat, die bewirkt, dass radiale Gradienten riesige Speichermengen zuweisen, wenn diese Attribute anfänglich zu groß sind. – jsight

+1

und ändern Sie die Höhe und Breite Attribute auf dem Root-Element ist nicht genug? – ThibThib

Antwort

1

Ich würde die Apache Batik Toolkit verwenden, um eine kleine Java-App zu schreiben, die durch Ihren SVG-Dokumentbaum läuft und alle Elemente transformiert.

5

Sie könnten

<g 

mit

<g transform="scale(0.5)" 

ersetzen, die alles um 50% vergrößern sollte.

0

viewBox Attribut in der Svg-Element-Tag, tut der Trick der Skalierung oder Sie können sagen, Zoomen von gesamten Svg Canvas. Zum Beispiel

<svg 
    xmlns="http://www.w3.org/2000/svg" 
    width="1024.09" 
    height="1024.36" 
    id="svg2" 
    viewBox = "0 0 300 300"> 

hier in viewBox, 0, 0 sind für neue x und y jeweils 300, 300 für neue Breite und neue Höhe der Leinwand.

0

einfach zwicken die width und height Attribute des svg-Tag mit einem Texteditor:

<svg 
    ... 
    width="102.409" 
    height="102.436" 
...