2009-07-07 3 views
1

Есть ли способ сценария перемасштабирования .SVG от его текущего размера (в тысячах пикселей) до гораздо меньшего размера? Я пробовал ImageMagick, но его поддержка градиентов SVG слишком слаба, чтобы быть полезной.Есть ли сценарий для изменения размера SVG?

Целью является обход ошибки в библиотеке рендеринга, которая иногда приводит к тому, что svg с большими размерами пикселей выделяют большие растры (до того, как в конечном итоге их масштабировать плавно вниз для фактического отображения).

Например, как я могу изменить это 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> 

К 102.4x102.4 SVG? Было бы неплохо, если бы он не уронил кусочки SVG (какой вид правил libsvgbin2, хотя он близок).

+2

что вы подразумеваете под «изменить размер SVG»? Поскольку это векторное описание (S для «Масштабируемое»), в пикселях нет реального размера ... Если вы хотите изменить размер (в пикселях) SVG-дисплея в браузере, например, вы можете просто изменить свойства «ширина» и «длина» элемента . – ThibThib

+0

@ThibThib. В результате изменения размера я имею в виду изменение атрибутов высоты, ширины и вида окна размера для корневого элемента, а также параметров координат для всех группы/пути в svg. Перевод простого клиента не будет работать, так как рассматриваемая библиотека имеет патологическое взаимодействие с Java 1.5.0_19 в OSX, что приводит к тому, что радиальные градиенты выделяют огромные объемы памяти, если эти атрибуты изначально были слишком большими. – jsight

+1

и изменить атрибуты высоты и ширины на корневом элементе недостаточно? – ThibThib

ответ

1

Я бы использовал Apache Batik Toolkit, чтобы написать небольшое приложение Java, которое проходит через дерево документов SVG и преобразует все элементы.

5

Вы могли бы заменить

<g 

с

<g transform="scale(0.5)" 

Который должен масштабироваться все на 50%.

0

viewBox атрибут в теге элемента svg, трюк масштабирования или вы можете сказать, масштабирование всего холста SVG. Например

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

здесь в Viewbox, 0, 0 являются для новых х и у, соответственно, 300, 300 для новой ширины и высоты нового холста.

0

Просто подправить width и height атрибуты svg тега с помощью текстового редактора:

<svg 
    ... 
    width="102.409" 
    height="102.436" 
... 
Смежные вопросы