Como posso escalar um SVG via linha de comando?


17

Um SVG tem essas propriedades, que determinam seu tamanho:

width="146.91299pt"
height="78.079002pt"
viewBox="0 0 146.913 78.079"

Eu gostaria de escalar um determinado SVG para um com da 400ptlinha de comando sem quebrar a proporção. Isso significa que os três valores acima devem ser alterados corretamente e todos os pontos no código svg a seguir. Não quero alterar apenas o tamanho da tela, mas todo o tamanho da imagem svg. E não quero fazer isso com uma GUI / à mão, mas quero fazê-lo com a CLI.

Como posso dimensionar automaticamente um SVG por linha de comando para uma determinada largura?

Motivo: a visualização da Wikipedia parece ruim se a imagem for muito pequena. Veja esta imagem como um exemplo.

Como eu faria essa tarefa com o Inkscape-GUI

  1. Shift + Ctrl + M (Transformação)
  2. Escala (marque "escala proporcionalmente")
  3. Digite a largura
  4. Shift + Ctrl + D (propriedades do documento)
  5. Ajustar página à seleção

Agora eu quero uma maneira CLI automática para fazer isso.

A propósito, o inkscape simplesmente aplicou

<g transform="matrix(1.6838397,0,0,1.6838397,-3.3543029,-3.3542794)"
 id="surface0">

para toda a imagem.


Qual SO você usa?
terdon

Ubuntu 10.04.4 LTS (vou atualizá-lo ...)
Martin Thoma

Arquivos SVG são apenas arquivos de texto. Você pode ser capaz de editar o arquivo e alterar as width, heighte viewBoxos valores para algo como width="100%" height="100%" viewBox="0 0 400 212.58569".
martineau

Eu sei que eles são apenas arquivos de texto. Mas se eu editar apenas esses valores, o tamanho da imagem não mudará. Somente o tamanho da tela é alterado. Editar manualmente não é uma opção, afirmei explicitamente que desejo alterá-lo automaticamente.
Martin Thoma

Sim, eu sei que você solicitou uma maneira automatizada de fazer isso, mas pensou que, se você pudesse descobrir o que alterar em termos de texto, poderia automatizá-lo usando qualquer uma das várias ferramentas de edição de texto disponíveis (como como sedna resposta de @ terdon). Um problema que você pode encontrar é que os valores precisam ser diferentes de outros arquivos .svg aos quais você deseja fazer a mesma coisa.
martineau

Respostas:


15

rsvg-convertdo librsvg2-binpacote pode redimensionar svg.

Veja esta resposta para obter instruções completas.


4
rsvg-convert -a -w 500 -f svg Vector-triangle-inequality.svg -o Result.svgtrabalhou. Mas o rsvg-convert parece fazer mais do que apenas redimensionar.
Martin Thoma

2
@moose, no entanto, conforme observado nessa resposta, o rsvg-convert usa pontos, não pixels. Se você tiver sorte, basta dividir o tamanho pretendido por 1,25. No entanto, se você quiser algo como 24px (19,2 em pontos), não terá sorte, pois não está disposto a colocar um não inteiro como largura ou altura (não tenho certeza se o SVG permite isso).
Matthew Flaschen

@MartinThoma Sim, de fato. O arquivo de saída SVG é aproximadamente o dobro do tamanho original. Eu quero saber porque? A leitura rsvg-convert --helpnão fornece nenhuma pista.
Serge Stroobandt

1
O rsvg convert também parece converter caminhos traçados em caminhos descritos. Você não pode querer isso (eu sei que eu não)
scruss

1
Essa ferramenta parece obstruir transformações em cada elemento e, na verdade, não altera os tamanhos originais.
Rtaft

3

Se você deseja alterar apenas uma imagem, abra-a em um editor de texto (emacs por exemplo) e altere a entrada de largura.

Para uma abordagem mais nerd da CLI, use sed:

$ sed 's/width=\"146.91299pt\"/width=\"400pt\"/' orig.svg > new.svg

Isso não dimensionará a imagem, apenas definirá sua largura.


Uma maneira melhor, talvez, mas certamente uma que possa ser executada no modo em lote para muitas imagens, é usando o inkscape na linha de comando:

$ inkscape -z -e out.png -w 400 -h 400 in.svg

Para muitos arquivos (supondo que você queira que todos tenham a mesma largura), faça o seguinte. Requer conversão para png e assume que não há espaços nos seus nomes de arquivos:

$ for n in $(ls *svg | sed 's/.svg//'); do inkscape -z -e $n.png -w 400 -h 400 $n.svg; done

A conversão do ImageMagick foi minha primeira escolha, mas parece quebrar ao escalar svgs.


7
Seu comando inkscape resulta em um PNG, mas eu quero um SVG. Seu comando svg altera apenas o tamanho da tela, mas não o tamanho da imagem. Você não pode simplesmente usar um editor de texto e apenas alterar os valores mencionados acima. Eu acho que tenho que esclarecer a questão.
Martin Thoma

você também precisa adicionar uma tag: ... "> <g transform =" scale (2) "> <path .... /> </g> </svg> para dimensionar a imagem com o mesmo fator.
Stofke
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.