Converter em lote imagens SVG para o tamanho desejado PNG ou ICO

26

Eu tenho vários ícones SVG que gostaria de usar para que meu aplicativo seja desenvolvido no VB.Net 2010 e, como ele não tem suporte para lidar com ícones SVG, preciso convertê-los em PNG ou ICO, de preferência. resolução de saída. Eu encontrei essa ferramenta de linha de comando para o Ubuntu chamada rsvgconvert. Também temos alguma ferramenta para Windows?

Kushal
fonte

Respostas:

12

O ImageMagick possui uma ferramenta de linha de comando disponível para Linux e Windows (e outros). A ferramenta de conversão é convenientemente chamada de "converter". Aqui está uma documentação de uso .

E é aqui que você pode obter um instalador do Windows .

Esteira
fonte
Você também pode obtê-lo através do Windows Subsystem for Linux (WSL), comapt install imagemagick
antonyh 9/17/17
(isso se aplica ao linux, pode ser aplicado ao windows) se você ativar o verbose no IM, parece que o próprio IM usa o inkscape para criar um arquivo eps intermediário. portanto, eu gostaria de sugerir @ resposta de zetah
norte-Bradley
Aqui está um pequeno conversor baseado no ImageMagick para Windows: fosshub.com/SVG2PNG.html É antigo (a partir de 2014), mas ainda funciona e você não precisa ler nenhum documento.
8 dias
20

O ImageMagick não deve se associar imediatamente a qualquer tarefa em lote que envolva imagens. Especialmente neste caso em que o ImageMagick é uma solução ruim para a conversão de SVG.

Melhor tentar o Inkscape na linha de comando:

inkscape in.svg --export-png=out.png

zetah
fonte
8
Por que você diz que o inkscape é melhor que o ImageMagick? Não discordo (ou concordo), apenas curioso para obter mais detalhes.
Sam
A razão de ser Imagemagick é adequado para melhor PNG punho, jpg etc .. enquanto inkscape é melhor adequada para imagens punho vetor (SVG)
user93
1
Tal como está, isso não responde à pergunta sobre a conversão em lote , não é?
OR Mapper
Enquanto a resposta funciona, no Windows InkScape insiste em mostrar uma tela inicial de captura de foco com um atraso, o que torna impossível executar isso no modo em lote em segundo plano.
Timwi
@ Timwi Isso não acontece aqui. Lembre-se de usar a -zopção
Svish
5

A linha de comando não funcionou imediatamente, e eu queria que 100 arquivos fossem convertidos. Aqui está como eu fiz funcionar com o Windows 7:

  1. instale o inkscape - não o portátil!

  2. copie todos os seus arquivos svg em uma pasta, por exemplo, "C: \ svgs \":

  3. você cria um convert.batarquivo com esta linha dentro:

    FOR %%A IN (*.svg) DO "C:\Program Files (x86)\Inkscape\inkscape.exe" --export-png=%%A.png
    

    (aponte para a pasta correta da sua instalação):

  4. abra o CMD como administrador! Para fazer isso, pressione a tecla WIN, digite cmd, clique com o botão direito do mouse em "cmd.exe" e selecione "Executar como administrador".

  5. navegue até o seu "C: \ svgs \" e digite convert.bat - Todos os arquivos svg serão convertidos para PNGs.

  6. Use o Windows Explorer para procurar os arquivos PNG convertidos. No meu PC eles estavam na pasta:C:\Users\myname\AppData\Local\VirtualStore\Program Files (x86)\Inkscape\svgs

Espero que ajude.


Como a resolução da linha de comando só podia ser definida como fixa, tanto quanto eu podia ver, acabei usando a ferramenta InkscapeBatch . Lá eu poderia definir o DPI para aumentar todas as imagens relativamente.

Você precisa especificar as configurações corretas ou elas não funcionarão. Aqui está o que eu fiz:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Depois de clicar em "Concluir", você precisa pressionar o botão "Iniciar conversor de lotes ..." na barra de ferramentas:

insira a descrição da imagem aqui

Kai Noack
fonte
1
Provavelmente seu comando em lote não possui outro %%A(como um nome de arquivo de entrada). Além disso, por que você acha que ele deve funcionar apenas no modo de administrador?
OU mapeador
Então, como isso é melhor do que usar o ImageMagick?
Reinierpost
Infelizmente, esse link parece ter morrido também. (agosto de 2017)
Ideograma
@ Ideograma Encontrei outro provedor do download. softsea.com/download/InkscapeBatch.html
Kai Noack
para especificando o dpi é necessário adicionar essa opção --export-dpi=100, onde 100 é th valor de dpi
Xsmael
3

O InkscapeBatch faz o trabalho no Windows. Requer Inkscape .

Justinas Dūdėnas
fonte
Não funciona Eu tentei depois de instalar o Inkscape v0.91 e diz que o Inkscape não foi encontrado.
Joris Groosman
1
Parece não existir mais.
OR Mapper
ligação alternativo -> softsea.com/download/InkscapeBatch.html
computingfreak
3

Para a conversão de SVG para PNG, descobri que o cairosvg ( https://cairosvg.org/ ) tem um desempenho melhor que o ImageMagick. Etapas para instalação e execução em todos os arquivos em seu diretório.

pip3 install cairosvg

Abra um shell python no diretório que contém os arquivos .svg e execute:

import os

for file in os.listdir('.'):
    name = file.split('.svg')[0]
    cairosvg.svg2png(url=name+'.svg',write_to=name+'.png') 

Isso também garantirá que você não substitua os arquivos .svg originais, mas manterá o mesmo nome. Você pode mover todos os seus arquivos .png para outro diretório com:

$ mv *.png [new directory]
edank
fonte
Esta resposta é a única que funcionou para o meu arquivo SVG bastante grande, obrigado !!!
Ben Sandeen
1

Depois de lutar com isso por quase 2 horas, resolvi-me com o Inkscape. Como eu precisava converter em lote vários arquivos em várias resoluções diferentes, criei um script do Powershell. Com 106 SVGs, meu computador congelou por cerca de 5 segundos, portanto, tenha cuidado ao usá-lo.

# ENTER THE FULL PATH TO THE INKSCAPE EXECUTABLE
$inkscapeExe = "C:\Program Files\Inkscape\inkscape.exe"
# ENTER THE PATH TO THE FOLDER CONTAINING THE SVGs
$svgFolder = "C:\Images\SVG"
# ENTER THE DESIRED WIDTH
$width = 120
# ENTER THE DESIRED HEIGHT
$height = 120

$svgFiles = Get-ChildItem $svgFolder -Filter *.svg
foreach ($svgFile in $svgFiles)
{
    $inputParam  = $svgFile.FullName 
    $outputParam = "--export-png=" + $svgFile.FullName + "-" + $width + "x" + $height + ".png" 
    $widthParam  = "-w" + $width
    $heightParam = "-h" + $height

    & $inkscapeExe $inputParam $outputParam $widthParam $heightParam
}
Eugen Timm
fonte
Mina congelou por mais de alguns segundos. O &operador inicia um novo processo e continua imediatamente, portanto esse script criará tantos novos processos inkscape.exe quanto os arquivos svg. Acontece que isso torna seu computador muito lento por um tempo.
Rory
Se você colocar | Out-Nullno final da linha que começa com &ele forçará a execução do comando inkscape.exe, um de cada vez, o que funciona muito melhor para mim.
Rory
1

Você pode usar o seguinte no Bash / Ubuntu para Windows, na pasta em que você tem os SVGs. Parece, no entanto, que o ImageMagick primeiro rasteriza e depois redimensiona, o que resulta em artefatos estranhos…

find -name "*.svg" -exec convert {} -background none -density 300 -resize 256x256 -define icon:auto-resize -alpha remove -colors 256 {}.ico \;

Veja também aqui a solução baseada no Inscape que parece estar funcionando bem (de outro segmento, link perdido): mkdir temp; declare -a res=(16 24 32 48 64 128 256); for f in *.svg; do for r in "${res[@]}"; do inkscape -z -e temp/${f}${r}.png -w $r -h $r $f; done; resm=( "${res[@]/#/temp/$f}" ); resm=( "${resm[@]/%/.png}" ); convert "${resm[@]}" ${f%%.*}.ico; done; rm -rf temp;

Arty2
fonte
1
+1 Usei-o com o Inkscape em uma versão muito simplificada find -name "*.svg" -exec inkscape {} -e {}.png \;Embora eu prefiro esta versão: ls | grep ".svg" | xargs -I file inkscape file -e file.pngporque os arquivos são processados em ordem alfabética - este não é o caso, quando se utilizafind
loved.by.Jesus
0

O ImageMagick está disponível para Windows e pode converter entre SVG e PNG e ICO (entre outros). Você pode definir o tamanho e outros atributos para o arquivo de saída.

Pausado até novo aviso.
fonte
0

Não consegui encontrar um único comando que funcionasse para executar um lote, portanto, consegui-o gerando uma lista de arquivos e criando uma série de comandos. Essas instruções devem funcionar para todas as versões do Windows. Todas as instruções de digitação excluem citações e incluem tudo entre elas.

Para fazer isso, você precisará do Inkscape, MS Excel ou editor de planilha comparável e um gerador de lista. Há um ótimo gerador de lista de freeware aqui: https://www.portablefreeware.com/?id=1171

  • Faça o hardlink, copie ou mova todos os arquivos svg para uma pasta.
  • Gere uma lista de arquivos dessa pasta e exporte para csv.
  • Abra o csv no Excel e exclua todas as colunas, exceto a coluna do nome do arquivo. Exclua também os títulos das colunas, como [Path], e o texto de resumo na parte inferior.
  • Se os nomes dos arquivos ainda não estiverem na segunda coluna, recorte e cole-os lá.
  • Na primeira célula da primeira coluna, digite inkscape seguido de um espaço e o caminho da pasta em que seus arquivos svg estão incluindo uma barra invertida (por exemplo, "inkscape C: \ SVG \"). Em seguida, copie esta célula, selecione todas as células abaixo dela que precedem um nome de arquivo e cole para que todas tenham o mesmo texto.
  • Na terceira coluna, digite --export-png = na primeira célula, seguida pela pasta de destino em que você deseja salvá-las. Acabei de usar a mesma pasta. Para que a sintaxe esteja correta, adicione um espaço no início, mas mantenha o restante do texto juntos (por exemplo, "--export-png = C: \ PNG \"). Copie e cole isso para todas as linhas, assim como a primeira coluna
  • Copie a segunda coluna inteira e cole-a na quarta coluna. Com a quarta coluna selecionada, pressione Ctrl + H (Localizar e substituir). No campo de localização, digite ".svg" No campo de substituição, digite ".png" e selecione Substituir tudo.

Se você fez isso corretamente, deverá ter uma linha para cada nome de arquivo que se pareça com isto: | inkscape C: \ SVG \ | Filename1.svg | --export-png = C: \ PNG \ | Nome do arquivo1.png |

  • Na primeira célula da quinta coluna, digite "= concatenar (a2, b2, c2, d2)". Isso pressupõe que a coluna do cabeçalho não foi excluída. Os números das células entre parênteses devem concordar com o número da linha atual. Se o seu primeiro nome de arquivo estiver em B2, a fórmula acima é precisa. Caso contrário, os nomes das células entre colchetes correspondem à primeira linha do nome do arquivo (por exemplo, a1, b1, c1 ...)
  • Copie e cole esta célula para preencher tudo abaixo, como nas colunas 1 e 3.
  • Agora copie toda a quinta coluna e use Colar Especial> Valores para colar o texto produzido pelas fórmulas na sexta coluna. Esta sexta coluna é a sua chance de ganhar dinheiro. Copie a sexta coluna inteira, abra o Bloco de Notas e cole a última coluna nela. Se você fez isso corretamente, terá uma linha de comando para converter cada um dos seus arquivos svg em pngs.
  • Salve o arquivo do bloco de notas no diretório do Inkscape como um arquivo em lotes. Quando a janela salvar como for aberta, altere o tipo Salvar como para "Todos os arquivos" e salve-o como um arquivo .bat (por exemplo, "C: \ Arquivos de programas \ Inkscape \ SVGBatch.bat"
  • Tudo o que resta a fazer é entrar nessa pasta e clicar duas vezes no arquivo em lotes que você acabou de salvar. Ele deve abrir um prompt de comando e converter todos os arquivos.

Espero que facilite a vida de alguém. James

James
fonte
0

A resposta de Kai está próxima, mas não funcionou para mim. No entanto, com alguns pequenos ajustes, isso funcionou perfeitamente na primeira vez:

  1. Copie seus SVGs para um local acessível
  2. Crie um arquivo de texto na mesma pasta e renomeie-o convert.bat
  3. Abra convert.batno seu editor de texto / código favorito e digite o seguinte:

FOR %%A IN (*.svg) DO "C:\Program Files\Inkscape\inkscape.exe" %%A --export-png=%%A.png

(Observe que o inkscape.exelocal deve corresponder ao local do programa executável no seu PC; e o segundo anterior --export-pngé %%A- esse é o arquivo SVG sendo convertido)

  1. Clique duas vezes convert.batpara executar e deve ecoar os resultados das conversões.

Observe que pode ser necessário atualizar sua pasta do Windows para ver os novos arquivos, mas todos eles devem ter sido criados no mesmo local que os SVGs originais.

indextwo
fonte
0

Não foi possível fazer com que o imagemagick ou o inkscape funcionasse para mim por algum motivo. Eu só tinha 12 arquivos para converter, apenas usei este site manualmente: http://svgtopng.com/ funcionou.

queimaduras mate
fonte
0

Aqui está uma solução baseada no ImageMagick para converter todos os arquivos svg em um determinado diretório em arquivos ico:

mogrify -format ico -density 1200 -background transparent -trim -resize 256x256 -gravity center -extent 256x256 -define icon:auto-resize *.svg

Explicação:

  • mogrify: Como convert, mas permite processar vários arquivos em lote.
  • -format ico: Nosso formato de arquivo de destino. Cria .icoarquivos em vez de sobrescrever o arquivo original (como o mogrify faria por padrão).
  • -density 1200: Como não podemos especificar um tamanho de pixel de destino para o qual o ImageMagick deve rasterizar o SVG (ele primeiro rasteriza com uma densidade padrão e depois escala), rasterizamos o SVG com uma resolução incrivelmente alta (1200 dpi), para garantir que a imagem será reduzido para 256x256 em vez de aumentado.
  • -background transparent: O plano de fundo será renderizado como transparente.
  • -trim: Remova a borda existente ao redor da imagem.
  • -resize 256x256: Dimensione a imagem, garantindo que o lado mais longo possua 256px, mantendo a proporção.
  • -gravity center -extent 256x256: Amplie a tela, garantindo que o lado curto também tenha 256px. A imagem existente é alinhada ao centro. Isso é necessário porque precisamos de uma imagem quadrada como base para um arquivo ICO.
  • -define icon:auto-resize: Inclua não apenas a imagem de 256x256, mas também todas as resoluções reduzidas recomendadas (por exemplo, 32x32) no arquivo ICO.
Heinzi
fonte
0

A maioria das respostas fornecidas aqui ignora a parte do tamanho desejado da pergunta. Não foi possível obter resultados satisfatórios convertao usar o "upscaling" de um SVG. inkscapefaz um trabalho melhor e também preserva a transparência do plano de fundo.

Dependendo do seu caso de uso, use uma das seguintes opções:

  1. exportar no DPI especificado: inscape in.svg -d 300 -e out.png
  2. exportar na largura especificada (mantendo a proporção): inscape in.svg -w 800 -e output.png
  3. exportar na altura especificada (mantendo a proporção): inscape in.svg -h 600 -e output.png

Observe que especificar largura e altura não preserva a proporção da imagem.

Para converter muitos arquivos de uma só vez, ajuste o seguinte ao seu caso de uso (in bashou compatível):

for f in *.svg; do
  inkscape $f -d 300 -e ${f%.*}.png
done
kynan
fonte