Removendo transformações em arquivos SVG


155

Estou lutando com isso há um tempo e parece que não consigo encontrar uma resposta (que funcione) em qualquer lugar. Eu tenho um arquivo SVG que se parece com isso:

<svg

   xmlns:dc="http://purl.org/dc/elements/1.1/"
   ...
   width="72.9375"
   height="58.21875"
   ...>
   ...
   <g
     ...
     transform="translate(10.75,-308.96875)"
     style="...">
     <path
       inkscape:connector-curvature="0"
       d="m -10.254587,345.43597 c 0,-1.41732 0.17692,-2.85384 0.5312502,-3.5625 0.70866,-1.41733 2.14518,-2.82259 3.5625,-3.53125 1.41733,-0.70866 2.11392,-0.70867 3.53125,0 1.41732,0.70866 ... z"
       ... />
  </g>
</svg>

Quero remover a transform="..."linha, mas ainda assim minha imagem fica onde a coloquei (no InkScape). Se eu remover manualmente a transformação, a imagem passará para outra parte da tela (conforme o esperado), mas preciso me livrar completamente da transformação e, ao mesmo tempo, manter a imagem exatamente onde eu quero. Existe uma maneira de remover / achatar as transformações nas próprias coordenadas do caminho? (As únicas transformações com as quais tenho de lidar são traduzir e dimensionar, sem matrizes.)



Respostas:


149

Como remover transformações no Inkscape

  1. Abrir arquivo svg no Inkscape
  2. Vá para Editar -> Editor XML
  3. Encontre atributos "transformar" em camadas e exclua-os

Como mover todos os objetos completamente sem criar outros atributos de transformação

  1. Vá para Editar -> Selecionar tudo em todas as camadas
  2. Vá para Objeto -> Transformar

    No painel Transformar

  3. Desmarque Mover relativo e marque Aplicar a cada objeto separadamente

  4. Defina os valores Horizontal e Vertical de acordo com suas necessidades e clique em Aplicar

16
Trabalhou para mim. Os objetos precisam ser desagrupados antes de serem transformados para que as coordenadas reais dos caminhos sejam atualizadas.
Rupert Angermeier

8
Hm, depois de configurá-lo como 0 e clicar em aplicar, a transformação será exibida no editor XML novamente.
escapedcat

7
Desagrupar os objetos é necessário para que isso funcione para mim, obrigado!
Hai Zhang

1
Não funcionou para mim. Ele achatará e moverá o atributo de transformação para folhas (na verdade, tudo se tornará uma folha após desagrupar), mas não REMOVERá o atributo de transformação e APLICÁ-LO À PONTA DA GEOMETRIA, sem a qual estou de volta à estaca zero.
Szczepan Hołyszewski

2
IMPORTANTE: Como um comentário acima explicado, é necessário desagrupar os objetos para que isso funcione corretamente, caso contrário a transformar atributo será definido novamente automaticamente
Sombra

52

Eu descobri qual era o problema. Eu esperava não ter que recorrer à resposta de Robert, embora eu esteja feliz por confirmar que funcionaria! No final, a resposta de Duopixel foi na verdade a mais próxima, embora aconteça alguma outra coisa acontecendo também.

Quando você trabalha com caminhos diferentes nos documentos do Inkscape, acredito que o comportamento padrão é agrupá-los sob uma <svg:g.../>tag. Ao modificar caminhos em um grupo, o Inkscape adiciona automaticamente uma transformação ao grupo para representar essas alterações. No entanto, se você abrir o editor XML e arrastar o seu caminho para fora da <svg:g.../>marca e torná-la sua própria <svg:path.../>marca, o Inkscape poderá editar os pontos individuais à vontade. No final, acabou sendo um problema de agrupamento, embora eu estivesse trabalhando apenas com um caminho! Espero que isso ajude outras pessoas em situações semelhantes.


7
Impressionante! Obrigado! Isso é exatamente o que estava fazendo. Acabei de excluir a tag do grupo deixando o conteúdo interno, salvei e reabri no inkscape. É claro que a imagem estava fora da caixa de exibição (ou como quer que seja chamada), mas então apenas defino x, y e está corrigida. Que dor. Obrigado por compartilhar isso!
31413 johntrepreneur

1
No meu caso, combinei abordagens desta resposta com outra dessa resposta .
quasiyoke

Isso deve ser votado e levado ao topo. Isso resolve o problema de maneira elegante e funcionou para mim. E mesmo se os gráficos são extraviado fora da tela você sempre pode redimensioná-la (Edit> tamanho da página Selecção)
tangerina

48

insira a descrição da imagem aqui

  1. Carregue seu SVG no Método Draw http://editor.method.ac (Arquivo> Abrir imagem)
  2. Desagrupar seus elementos (Objeto> Desagrupar elementos), pode ser necessário fazer isso mais de uma vez.
  3. Selecione seu caminho
  4. Reorientar o caminho (Objeto> Reorientar Caminhos).
  5. Salve sua imagem (Arquivo> Salvar imagem) Se ela aparecer em uma nova janela, clique com o botão direito do mouse e em "Salvar imagem como ..."

1
Não há Objeto> Reorientar Caminhos. A qual versão você está se referindo?
0__

1
@ 0__ Se este item de menu estiver desativado, significa que seu caminho ainda está dentro de um grupo. Desagrupe novamente.
methodofaction

37

Há uma extensão do inkscape chamada Apply Transforms que recalcula os caminhos com suas transformações. É exatamente isso que eu tenho procurado.

Após a instalação, você encontrará o menu em Extensões> Modificar caminho> Aplicar transformação .


créditos: Fórum Inkscape> Remova todas as transformações enquanto mantém o local


Esta extensão foi atualizada e agora também funciona para rects, pelo menos nos meus testes.
sil

Absolutamente. O poder que esse pequeno plug-in oferece é incomensurável!
brett

23

Para grupos, o reagrupamento pode fazer o trabalho rapidamente. Selecione o grupo e pressione Ctrl + Shift + G (desagrupar) e, em seguida, Ctrl + G (grupo).

Para alguns objetos que têm um problema semelhante, espirais e estrelas, por exemplo, a maneira mais rápida é pressionar Ctrl + Alt + C (toque no caminho) - no entanto, isso converte o objeto em um caminho puro e remove todos os atributos extras, como sodipodi: cx, sodipodi: revoluções e assim por diante.


23

Abra seu svg no Inkscape :

  • Selecione o grupo que contém todas as transformações que você deseja eliminar
  • Pressione CTRL+ U(desagrupar)
  • Pressione CTRL+ G(agrupar novamente)

Dessa forma, você se livrará das transformações aplicadas ao grupo e elas serão transferidas para os caminhos contidos nesse grupo.


1
Perfeito! Isso funcionou no Inkscape 1.0
Wizard of Ogz

14

Na minha experiência, se você estiver usando o Inkscape, basta mover um pouco o elemento do caminho (por exemplo, com as teclas do cursor), e o Inkscape excluirá o atributo de transformação e ajustará os dados do caminho de acordo. (Irritante, se você realmente deseja manter o atributo de transformação.)

Portanto, você pode simplesmente selecionar o caminho (verifique se é o caminho e não o grupo circundante), pressione a tecla de cursor direita e esquerda e pronto.


1
Isso não parece funcionar para um elemento <g>. Estou tentando me livrar do atributo transform.
Max Primavera

5
Talvez tente desagrupar primeiro e reagrupar depois.
Thomas W

1
Uau, funcionou como um encanto! Essa deve ser a resposta aceita. Não são necessárias ferramentas extras, etapas complicadas. Outras respostas não funcionam se o caminho estiver aninhado em uma transformação <g>e eu quero manter a transformação na <g>.
tomekwi

Não funciona para um caminho criado pela ferramenta de círculo, ou
sdaau

1
A melhor resposta. Talvez uma fonte de confusão seja a opção Preferências> Transformações> Transformação de loja, que não vejo mencionada em nenhum outro lugar aqui. Deve ser definido como "otimizado". Em seguida, basta desagrupar, mover, agrupar e transformar as transformações são removidas.
Mr5o1

13

Enquanto prefiro o Inkscape, o Affinity Designer (~ $ 40 / Mac) me salvou horas de esforço ao trabalhar com o Android Vector Drawables.

Abra um SVG, Arquivo -> Exportar -> SVG -> Mais -> Achatar transformações funcionou muito bem.

Affinity Designer


12

O SVGO é uma excelente ferramenta de linha de comando de código aberto para isso e várias outras otimizações. Existe uma interface da web on-line igualmente excelente, chamada SVGOMG

As opções relevantes neste caso são moveGroupAttrsToElems(SVGOMG: Move group attrs to elements) para mover transformatributos de grupos de elementos de caminho, mais convertPathData(SVGOMG: Round/rewrite paths) para achatar transformem d.


1
SVGO é incrível. Essa deve realmente ser a resposta aceita, especialmente porque o stackoverflow é do ponto de vista do programador e essa é de longe a melhor solução para um programador que desenvolve um site contendo SVGs. Colocar isso em seu pipeline de implantação é muito melhor do que ter que ensinar a seus artistas para remover as transformações à mão (ou ter que fazê-lo sozinho) e recebendo um relatório de erro cada vez que eles se esquecem
UTF_or_Death

3
Exceto que isso não funciona mais. Lembro-me trabalhar melhor uma vez, mas ver esta questão sobre esse recurso exata github.com/svg/svgo/issues/624 para SVGO
morewry

9

Deve-se mencionar que existe o modo "Otimizado" nas preferências:

Preferências do Inkscape> Transformações> Transformação de loja> Otimizado

O que deve minimizar a ocorrência de transformatributos o máximo possível (mas não).

De qualquer maneira, parece estar ativado por padrão.

Segundo uma discussão , uma instância em que esse modo Otimizado não possui zelo é quando a página é redimensionada . Isso faz com que uma translatetransformação seja aplicada ao <g>elemento da camada . Parece que evacuar as crianças para outra camada é a melhor solução no momento.


2
Para redimensionar a página sem criar translatetransformações irritantes em todas as camadas, tente abrir o .svgarquivo em um editor de texto e manipule os atributos de altura e largura que aparecem na parte superior.
februaryInk

7

O Inkscape tem a opção de limpar os dados da transformação, mas ainda não modifica o valor do objeto.

No Inkscape, selecione o objeto e o menu 'Caminho', 'Simplificar'. Agora, você terá as transformações removidas.


16
No entanto, ele alterará o contorno de seus caminhos e reduzirá o número de vértices em formas complexas.
Charlie

1
Isso geralmente torna a marcação maior do que antes das transformações.
1877 Charlie

6

Nesse caso, basta adicionar a conversão aos valores m para cada filho, para -10,254587 + 10,75 = -0,504587 e -308,96875 + 345,43597 = 36,46722.

Como todos os termos do exemplo são relativos (ou seja, minúsculas), isso é tudo. Se algum fosse absoluto (maiúsculo), por exemplo, M ou C, eles também teriam que ser ajustados.

Para a escala, você basicamente multiplicaria todos os valores filhos pela escala.


Eu fiz isso, mas no editor XML do Inkspace (ou em qualquer outro editor) a transformação ainda é adicionada. Esquisito.
Escapadcat 5/15

1
De que maneira você ajustaria C se tivesse os 2 subcaminhos, por exemplo, M 8,0 12,0 C 11,3 13,1 14,9 13,55 16,0 13,0 C 2,4 9,8 2,8 10,2 8,0 12,0 C 7,6 7,8 7,6 8,1 5,0 9,0 e M 3,0 5,0 C 2,4 5,5 3,3 6,4 5,0 7,0 Quais você quer se transformar em um caminho?
Instalação

@Anton use o botão de pergunta se você tiver uma pergunta que não seja coberta pelas respostas existentes. É difícil perguntar e responder nos comentários, pois a formatação é muito limitada.
Robert Longson

2
@RobertLongson bem, você cobriu. Tudo o que desejo é que você elabore "Se algum fosse absoluto (maiúsculo), por exemplo, M ou C, eles também teriam que ser ajustados".
Instalação

6
  1. Selecione os elementos em questão
  2. Objeto> Desagrupar (repita até que tudo esteja desagrupado; consulte o editor XML para obter os nós aninhados)
  3. Caminho> Objeto para caminho (converte polígonos em caminhos)
  4. Objeto> Transformar> Desmarque movimento relativo> Aplicar

Não parece funcionar no Inkscape 0.91. O atributo <g>with transformpermanece como estava. Além disso, meu objeto (exatamente como o mostrado na pergunta aqui) já é um caminho.
OU Mapper

Você pode colar um link para o seu SVG?
31416 Charlie

5

Para remover o atributo de transformação de um gelemento (grupo) no Inkscape, você pode mover o grupo para seu local final, desagrupá-lo e reagrupar todos os elementos. Agora, um novo grupo foi criado e, se você não o mover novamente, ele não receberá um atributo de transformação anexado a ele.


4

Se alguém chegar aqui procurando uma solução para fazer isso no Sketch 3, selecione a camada e clique em Camada-> Caminhos-> Achatar.


3

Encontrei:

  • Defina o tamanho da página desejado *
  • Se sua camada atual tiver uma transformação (verifique com o editor XML, é o grupo principal no elemento SVG), crie uma nova camada e mova todos os objetos para ela
  • Desagrupar qualquer grupo (isso pode não ser necessário, YMMV)
  • Selecione todos os objetos e aplique uma transformação nula (como dimensionar 100% a 100% ou seta para a direita + seta para a esquerda) enquanto obtém a transformação de Armazenamento: Otimizado em Preferências / Transformações
  • Se você tiver que desfazer um grupo, agora poderá reagrupá-lo
  • Salve uma cópia como SVG otimizado e defina a precisão numérica desejada

*: Ou pelo menos coloque os objetos onde você precisar deles, em relação ao canto superior esquerdo da página. É lamentável que as coordenadas SVG façam referência ao canto superior esquerdo, enquanto o Inkscape redimensiona a página em relação ao canto inferior esquerdo!


Eu precisava do truque "mover para outra camada", já que a transformação que eu queria empurrar estava no <g> de uma camada. O sistema de coordenadas do Inkscape é bastante irritante.
Mutant Bob

3

Consegui me livrar de uma matrix(...)transformação (devido ao espelhamento) combinando o caminho com um retângulo e removendo os nós do retângulo. A translate(...)parte ficou embora.


Esta é a única solução que encontrei também. Combine com um novo caminho limpo e remova a parte desnecessária.
Márton Tamás

2

No meu caso, salvar como SVG otimizado resolveu o problema. Portanto, no Inkscape, use:

Arquivo -> Salvar como ... -> SVG otimizado.


Qual foi o seu problema? Eu vim aqui depois de tentar de tudo. Mas o problema ainda persiste.
Sahu V Kumar,

@VishalKumarSahu Não foi possível importar o ícone do meu aplicativo Android (SVG) como um ativo devido ao transformatributo não ser suportado pelo Android Studio.
Michał Stochmal

Sim, e é o mesmo caso na web também. A transformação cria um problema na saída, mas é bastante útil durante a organização do objeto como um grupo. Eu tenho que fazer cálculos para resolver o objetivo.
Sahu V Kumar

2

Isso funciona se você estiver usando o Inkscape:

  1. Selecione tudo e desagrupe
  2. Salvar como "Svg otimizado (* .svg)"

Em todos os casos que tentei, isso remove quaisquer atributos de transformação. Não tenho certeza se funciona para SVG mais complexo.


1

Eu tentei a solução postada aqui, ou seja, para remover as tags de grupo no arquivo SVG e reabri-lo no Inkscape (0.48.3.1 no meu caso). Infelizmente, depois de traduzir os caminhos novamente usando o modo de seleção e transformação (F1) e salvá-lo, as tags de grupo reapareceram! O Inkscape salva todas as transformações aplicadas ao caminho em um elemento de grupo circundante. A menos que você use a ferramenta de seleção de nós do caminho (F2), pressione ctrl + a e mova os nós do caminho para o lugar certo. Depois que eu fiz isso e salvei depois, o Inkscape não adicionou as tags de grupo, porque essa tradução se aplicava diretamente ao modelo de caminho. Espero que isto ajude.


1

No meu caso, os grupos são realmente causados ​​por camadas. A exclusão de todas as camadas do documento removeu o grupo e a transformação (possivelmente combinada com o desagrupamento de objetos e o reagrupamento, etc., como em Removendo transformações em arquivos SVG (answer-35490189 de @Charlie acima))


0

Meu problema específico era com símbolos definidos fora da página, exigindo, portanto, que uma transformação fosse mostrada na página.

Para mover os símbolos para a página sem exigir uma transformação, tive que seguir estas etapas no Inkscape:

  1. Abra a janela Símbolos (Shift + Ctrl + Y)
  2. Remova o símbolo da biblioteca de documentos. (Existe um botão para isso na janela.)
  3. Agora o gráfico aparece no documento, fora do limite da página.
  4. Desagrupar o gráfico. (Este é um passo vital!)
  5. Mova o gráfico para dentro do limite da página.
  6. Adicione o gráfico de volta à biblioteca de símbolos.

0

Isso parece aleatório, mas nada mais que tentei funcionou, então aqui você vai aleatoriamente para outra pessoa. Alguns dos meus caminhos tinham uma espécie de margem ao redor deles, que só podia ser vista ao selecioná-los ( exemplo). Acho que isso foi criado quando colei uma camada de outro arquivo do inkscape e a girei 90 graus. Isso fez com que um preenchimento de padrão nas formas tivesse uma transformação diferente (linhas espaçadas mais afastadas). Também fez com que os objetos de alinhamento não funcionassem conforme o esperado. O uso da transformação de transformação mencionada por @Piotr_cz corrigiu o problema de transformação, mas a margem estranha permaneceu. Eu acidentalmente me livrei disso, alterando o Blur on Stroke para qualquer valor e alterando-o novamente para zero.


0

De alguma forma, não tive sorte com nenhuma das abordagens. Se houver uma <defs>seção no seu svg e usos como este:

<g transform="matrix( *** ) "><use xlink:href="#***"/></g>

pode ser necessário excluir todos os usos e remover tudo da seção defs. Em seguida, você pode usar o inkscape para colocar tudo da maneira correta e aplicar transformações usando o plug-in mencionado. Espero que ajude alguém.


0

Eu tenho esse problema há anos. A solução é claramente poder jogar dinamicamente com transformações no navegador, se não for "corrigido" no inkscape.

Um usuário Mc nos fóruns do Inkscape me deu essa solução .

A solução cria a transformação atual entre um elemento SVG e seu elemento raiz SVG e, em seguida, retorna um conjunto completo de informações BBox com base no total das transformações.

Também seria possível alterar facilmente a qual elemento os cálculos são relativos, caso você queira fazer no trabalho do navegador entre duas partes do mesmo arquivo SVG.

Finalmente, posso ter uma viewport SVG panorâmica.


0

Inkscape 1.0 no Kubuntu 20.04

Embora este tópico seja bastante antigo, gostaria de postar minha experiência / solução. Me deparei com esse problema ao tentar criar um modelo para o ambiente de trabalho TechDrawing do FreeCAD. Esses modelos não devem conter nenhuma transformação.

No meu caso, tive que adicionar um logotipo da empresa a partir de um arquivo .svg externo (totalmente feito com o Inkscape). Esse logotipo contém elementos gráficos e de texto. Ao copiar esse logotipo para o modelo, foram criadas transformações, que fizeram com que o modelo não funcionasse corretamente no FreeCAD.

  • Primeiro, esta solução sugerida em www.freecadweb.org / ... não funciona para mim. Por isso pesquisei na web e encontrei essa discussão.

  • Segundo, nenhuma das soluções sugeridas acima funcionou para mim, mas elas me colocaram no caminho certo. A resposta de Charlie chegou perto, mas Objeto> Transformar> Desmarcar movimento relativo> Aplicar não mostrou diferença.

O que funcionou para mim foi:

  1. Como mencionado por outros, desagrupe tudo.
  2. Converta objetos de texto em caminho - isso parecia essencial no meu caso!
  3. Exclua todas as transformações existentes no xml-Editor e observe o que acontece com os objetos relacionados. No meu caso, os elementos correspondentes mudaram de posição.
  4. Corrija essas alterações manualmente, mas não agrupe nada.
  5. Salvar como svg normal (normal = nenhuma otimização ou outras configurações especiais foram usadas)

Funciona bem quando eu uso esse modelo no FreeCAD.


Um detalhe estranho: embora minha solução mostre que os elementos de texto eram o problema no meu caso, não pode ser tão fácil assim. De fato, o documento base (aquele no qual copiei o logotipo) contém muitos elementos de texto e não os converti. Portanto, pode ser a combinação de "fonte externa" e elementos de texto. Eu apenas postei esses detalhes como uma dica para outras pessoas, que podem ter problemas relacionados.

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.