Como alterar o DPI de um arquivo PNG? (na linha de comando, sem ImageMagick)

9

Estou procurando uma maneira de alterar o DPI nos arquivos de imagem PNG. Usando o ImageMagick, é fácil:

$ convert -density 150 -units pixelsperinch file.png file.png

O problema é que executarei esse comando no meu aplicativo, executando em várias VMs, que não têm o ImageMagick instalado. Posso enviar os pacotes de atualização para essas VMs, mas no caso do ImageMagick, isso adicionaria cerca de 30 MB a um pacote de atualização, o que é um pouco demais para o meu caso de uso.

Para encurtar a história : existe uma maneira de alterar o DPI em um arquivo PNG usando uma pequena ferramenta de linha de comando (como no tamanho do pacote)?

Opcionalmente, alterar bytes em um arquivo de imagem bruto também seria bom, se alguém souber onde procurá-los ...

johndodo
fonte
Você pode considerar fazer sua própria implementação. Manipular os pedaços PNG é bastante direto. Se você pretende aplicar apenas um DPI específico a todos eles, nem precisa ter uma função de soma de verificação em funcionamento - basta copiar um pHYspedaço pré-fabricado de um PNG criado no Photoshop.
precisa

Respostas:

6

2,10 MB é pequeno o suficiente? Se sim, use NConvert e um comando em lote como:

nconvert -out png -dpi 150 -keepdocsize -keepfiledate mysource.png

Para que serve o NConvert?

O XnView é um aplicativo baseado em GUI, você pode alterar e manipular imagens usando uma interface gráfica do usuário. O NConvert possui os mesmos recursos do XnView, mas é uma ferramenta de linha de comando e não possui interface gráfica com o usuário. Você pode usar o NConvert em scripts em lote ou outro aplicativo pode chamá-lo.

Links úteis

  • Guia para iniciantes e Wiki com alguns exemplos para começar
  • Arquivo de ajuda para ver quais parâmetros da linha de comando estão disponíveis (Carregado em pastebin)
  • Um front-end gráfico usando o Nconvert é o XnConvert . Use isso para criar e exportar arquivos em lote do Nconvert
  • Fórum para Xnconvert e Nconvert para
nixda
fonte
Obrigado, parece ótimo e provavelmente será útil no futuro! Nesse caso, acabei estudando o formato PNG (que felizmente era bastante simples) e alterando as imagens através de um pequeno aplicativo personalizado (15 linhas em PHP).
Johndodo # 25/13
@johndodo Isso parece interessante. Você pode compartilhar seu aplicativo conosco?
Nixda 25/09
Infelizmente, não tenho liberdade para fazer isso, mas você pode fazer o mesmo lendo uma (ótima!) Especificação do formato de arquivo PNG e criando um aplicativo que altera o pedaço de pHYs . É realmente simples quando você sabe o que está fazendo.
Johndodo #
1

Você mencionou que estaria executando este comando "do seu aplicativo" e isso me leva a acreditar que você escreveu esse aplicativo ou está mantendo-o. Dito isto, existem APIs do ImageMagick para vários idiomas e você pode usar um deles para adicionar a funcionalidade diretamente ao seu programa existente. O aumento no tamanho do pacote dependerá do idioma em que seu aplicativo está escrito e se você vinculará a biblioteca estaticamente ou dinamicamente, mas eu imagino que seria significativamente menor que um aumento de 30 MB.

Outra opção é não incluir todo o pacote ImageMagick. Você pode baixar o arquivo Zip do ImageMagick (que tem apenas 13 MB BTW), extrair apenas a convertferramenta e suas dependências e distribuí-la às suas VMs. Existe uma ferramenta chamada Dependency Walker que você pode usar para determinar quais são as dependências da convertferramenta.

Drew Chapin
fonte
1

Use o -sizesinalizador no programa netpbm pnmtopng . As unidades usadas são pixels por metro. O exemplo a seguir definirá newfile.png para 300 dpi.

pngtopnm <oldfile.png | pnmtopng -size='11811 11811 1' >newfile.png
Diomidis Spinellis
fonte
0

Bem, você poderia usar um script python.

#!/usr/bin/python
im = Image.open("in.png")
nx, ny = im.size
im2 = im.resize((int(nx*1.5), int(ny*1.5)), Image.BICUBIC)
im2.save("out.png")

Fonte .

Gonçalo
fonte
O instalador do Python 3.3.2 (não incluindo o código-fonte) tem 19,3 MB e o instalador do Python 2.7.5 tem 15.5 MB.
Tirou Chapin
5
Isso redimensionará a imagem, não alterará o DPI.
Bobby
0

A linha de comando apropriada da Image Magick "convert" para isso seria usar o argumento -resample:

convert image.png -resample 150x150 -units pixelsperinch ../ImagesAdjusted/image.png
tolistim
fonte