Eu tenho um arquivo SVG que tem um tamanho definido de 16x16. Quando uso o programa de conversão do ImageMagick para convertê-lo em PNG, recebo um PNG de 16x16 pixels muito pequeno:
convert test.svg test.png
Preciso especificar o tamanho do pixel do PNG de saída. -size
parâmetro parece ser ignorado, ele -scale
dimensiona o PNG depois que ele foi convertido em PNG. O melhor resultado que obtive até agora usando o -density
parâmetro:
convert -density 1200 test.svg test.png
Mas não estou satisfeito, porque quero especificar o tamanho da saída em pixels sem fazer contas para calcular o valor da densidade. Então, eu quero fazer algo assim:
convert -setTheOutputSizeOfThePng 1024x1024 test.svg test.png
Então, qual é o parâmetro mágico que eu tenho que usar aqui?
svg
imagemagick
png
kayahr
fonte
fonte
-size 1024x1024
está funcionando bem, qual é a sua versão do imagemagick?-resize
apenas estica a imagem convertida, com resultados de baixa qualidade.convert -size 1024x1024 test.svg test.png
funciona bem com o ImageMagick 7.0.7-0 Q16 (versão atual no repositório Chocolatey para Windows). Apenas certifique-se de que-size
apareça antes do nome do arquivo de entrada, caso contrário, uma imagem 16x16 será aumentada para dar um resultado desfocado.Respostas:
Não consegui obter bons resultados com o ImageMagick nesse caso, mas o Inkscape faz um bom trabalho no Linux e no Windows:
Editar (maio de 2020): usuários do Inkscape 1.0, observe que os argumentos da linha de comando foram alterados:
Aqui está o resultado do dimensionamento de um SVG de 16x16 para um PNG de 200x200 usando este comando:
Apenas para referência, minha versão do Inkscape (no Ubuntu 12.04) é:
e no Windows 7, é:
fonte
/Applications/Inkscape.app/Contents/Resources/bin/inkscape -z -e test.png -w 1024 -h 1024 test.svg
-background none
opção de linha de comando.Tente svgexport :
svgexport é uma ferramenta simples de linha de comando de plataforma cruzada que criei para exportar arquivos svg para jpg e png, veja aqui para mais opções. Para instalar o svgexport, instale o npm e execute:
Edit: Se você encontrar um problema com a biblioteca, envie-o no GitHub, obrigado!
fonte
Isso não é perfeito, mas faz o trabalho.
Basicamente, aumenta o DPI alto o suficiente (basta usar um palpite seguro / educado) para que o redimensionamento seja feito com qualidade adequada. Eu estava tentando encontrar uma solução adequada para isso, mas depois de um tempo decidi que isso era bom o suficiente para a minha necessidade atual.
fonte
-resize 200%
não funcionou e eu tive que especificar o tamanho em pixels.-background none
opção de linha de comando. Para manter a proporção da imagem, você também pode especificar apenas uma dimensão, como-resize 200
largura ou-resize x200
altura. Consulte: imagemagick.org/script/command-line-processing.php#geometry para obter opções exaustivas de geometria do ImageMagick .Se você estiver no MacOS X e tiver problemas com a conversão do Imagemagick, tente reinstalá-lo com a RSVG lib. Usando o HomeBrew:
Verifique se está delegando corretamente:
Deve aparecer
rsvg
.fonte
convert ic_comment_48px.svg -size 30x30 ic_comment_30px.png
e a imagem de saída é 48 x 48. Verifique se o imagemagick está delegando no rsvg, como você explicou.convert
converteu svg para png, mas os resultados foram inúteis; depois de reinstalar, eles são perfeitos. Além disso, a conversão é significativamente mais rápida.invalid option: --with-librsvg
O Inkscape parece não funcionar quando as unidades svg não são
px
(por exemplo, cm). Eu tenho uma imagem em branco. Talvez pudesse ser corrigido girando o ppp, mas era muito problemático.Svgexport é um programa node.js e, portanto, geralmente não é útil.
O conversor do Imagemagick funciona bem com:
Se você usar
-resize
, a imagem ficará confusa e o arquivo será muito maior.MELHOR
É o mais rápido, possui o menor número de dependências e a saída é cerca de 30% menor que a conversão. Instale o librsvg2-bin para obtê-lo. Não parece haver uma página de manual, mas você pode digitar:
para obter ajuda. Simples é bom.
fonte
-a
parâmetro deve ser usado com o rsvg.brew install rsvg
no OSX instala um milhão de coisas - GDK, OpenSSL, Python etc.brew install librsvg
e o comando de conversão érsvg-convert
.rsvg-convert
no caso do Arch) para fornecer os melhores e mais consistentes resultados ao converter svgs complicados em png. Sigaoptipng
para reduzir o tamanho do arquivo de saída.Depois de seguir as etapas da resposta de Jose Alban , consegui que o ImageMagick funcionasse perfeitamente usando o seguinte comando:
O número 1536 vem de uma estimativa aproximada da densidade. Consulte esta resposta para obter mais informações.
fonte
Para redimensionar a imagem, a opção
-density
deve ser usada. Tanto quanto sei, a densidade padrão é 72 e mapeia o tamanho 1: 1. Se você deseja que o png de saída seja duas vezes maior que o svg original, defina a densidade como 72 * 2 = 144:fonte
convert source.svg -density 144 target.png
, não vai redimensionar a imagem.convert -density 180 source.svg target.png
por que você não tenta a linha de comando do inkscape, este é o meu arquivo bat para converter todos os svg deste diretório para png:
fonte
Eu vim para este post - mas eu só queria fazer a conversão por lote e rapidamente, sem o uso de nenhum parâmetro (devido a vários arquivos com tamanhos diferentes).
Para mim, os requisitos foram provavelmente um pouco mais fáceis do que para o autor original. (Queria usar SVGs no MS PowerPoint, mas não permite)
fonte
brew install librsvg
e o comando de conversão érsvg-convert
.No ImageMagick, obtém-se uma melhor renderização SVG se você usa o Inkscape ou o RSVG com ImageMagick do que o seu próprio MSVG / XML interno renderizado. O RSVG é um delegado que precisa ser instalado com o ImageMagick. Se o Inkscape estiver instalado no sistema, o ImageMagick o utilizará automaticamente. Eu uso o Inkscape no ImageMagick abaixo.
Não há parâmetro "mágico" que faça o que você deseja.
Mas, pode-se calcular muito simplesmente a densidade exata necessária para renderizar a saída.
Aqui está um pequeno botão de 50x50 quando renderizado na densidade padrão de 96:
Suponha que desejamos que a saída seja 500. A entrada é 50 na densidade padrão de 96 (versões mais antigas do Inkscape podem estar usando 92). Assim, você pode calcular a densidade necessária proporcionalmente às proporções das dimensões e densidades.
No ImageMagick 7, você pode fazer o cálculo em linha da seguinte maneira:
fonte
Uma coisa que me atrapalhou foi definir
-density
DEPOIS do nome do arquivo de entrada. Isso não deu certo. Mover para a primeira opção no convert (antes de mais nada) fez funcionar (para mim, YMMV, etc).fonte
Para uma simples conversão de SVG para PNG, descobri que o cairosvg ( https://cairosvg.org/ ) tem um desempenho melhor que o ImageMagick. Etapas para instalar e executar em todos os arquivos SVG no seu diretório.
Abra um shell python no diretório que contém os arquivos .svg e execute:
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:
fonte
cairosvg
no Ubuntu-19.04 fiz o trabalho por mim.Sem o librsvg, você pode obter uma imagem png / jpeg preta. Temos que instalar
librsvg
paraconvert
arquivo svg com o imagemagick.Ubuntu
Mac OS
fonte
Resolvi esse problema alterando os atributos
width
eheight
do<svg>
tag para corresponder ao tamanho de saída pretendido e convertendo-o usando o ImageMagick. Funciona como um encanto.Aqui está o meu código Python, uma função que retornará o conteúdo do arquivo JPG:
fonte
A resposta do @ 808sound não funcionou para mim. Eu queria redimensionar
e pegou
Então, ao invés eu abri Inkscape, em seguida, foi para
File
,Export as PNG file
e uma caixa GUI apareceu que me permitiu definir as dimensões exatas que eu precisava.Versão em
Ubuntu 16.04 Linux
:Inkscape 0.91 (September 2016)
(Esta imagem é dos pacotes de recursos de Kenney.nl, por sinal)
fonte
No macOS usando o brew, o uso do librsvg funciona diretamente bem
Muitas opções estão disponíveis via
rsvg-convert --help
fonte
No Linux com Inkscape 1.0 para converter de svg para png, é necessário usar
não
fonte