2009-07-07 6 views
1

Existe-t-il un moyen de programmer le redimensionnement d'un fichier .SVG de sa taille actuelle (milliers de pixels) à une taille beaucoup plus petite? J'ai essayé ImageMagick, mais son support pour les dégradés SVG est trop faible pour être utile. Le but est de contourner un bogue dans une bibliothèque de rendu qui oblige parfois les svgs avec de grandes tailles de pixels à allouer de grands rasters (avant d'être redimensionné pour un affichage réel).Y at-il un script disponible pour redimensionner SVG?

Par exemple, comment puis-je changer cette 1024x1024px svg:

<?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> 

Pour un 102.4x102.4 SVG? Ce serait bien si ça ne laissait pas tomber des morceaux du SVG (ce qui exclut libsvgbin2, même si ça se rapproche).

+2

qu'entendez-vous par « redimensionner un SVG »? Comme il s'agit d'une description vectorielle (le S est pour "Scalable"), il n'y a pas de taille réelle en pixels ... Si vous voulez changer la taille (en pixel) d'un affichage SVG dans un navigateur, par exemple, Vous pouvez simplement modifier les propriétés "width" et "length" de l'élément ThibThib

+0

@ThibThib - Par redimensionnement, je veux dire modifier les attributs height height, width et viewbox de l'élément racine, ainsi que les paramètres de coordonnées de tous les éléments. les groupes/chemins dans le svg. Une simple traduction côté client ne fonctionnera pas, car la bibliothèque en question a une interaction pathologique avec Java 1.5.0_19 sur OSX qui provoque des dégradés radiaux pour allouer d'énormes quantités de mémoire si ces attributs étaient initialement trop grands. – jsight

+1

et modifier les attributs de hauteur et de largeur sur l'élément racine ne suffit pas? – ThibThib

Répondre

1

Je voudrais utiliser le Apache Batik Toolkit pour écrire une petite application Java qui traverse votre arbre de document SVG et transforme tous les éléments.

5

Vous pouvez remplacer

<g 

avec

<g transform="scale(0.5)" 

Ce qui devrait tout échelle de 50%.

0

viewBox attribut dans la balise d'élément svg, fait le tour de la mise à l'échelle ou vous pouvez dire le zoom de la totalité de la toile svg. Par exemple

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

ici viewBox, 0, 0 sont pour les nouveaux x et y respectivement, 300, 300 pour la nouvelle largeur et la nouvelle hauteur de la toile.

0

Juste tweak les width et height attributs de la balise svg en utilisant un éditeur de texte:

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