¿Cómo cambiar el DPI de un archivo PNG? (en línea de comando, sin ImageMagick)

9

Estoy buscando una manera de cambiar el DPI en archivos de imagen PNG. Usando ImageMagick esto es fácil:

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

El problema es que ejecutaré este comando desde mi aplicación, ejecutándolo en varias máquinas virtuales, que no tienen instalado ImageMagick. Puedo enviar los paquetes de actualización a estas máquinas virtuales, pero en el caso de ImageMagick eso agregaría aproximadamente 30 MB a un paquete de actualización, lo cual es demasiado para mi caso de uso.

En pocas palabras : ¿hay alguna manera de cambiar el DPI en un archivo PNG usando una pequeña herramienta de línea de comandos (como en el tamaño del paquete)?

Opcionalmente, cambiar bytes en un archivo de imagen sin formato también estaría bien, si alguien sabe dónde buscarlos ...

johndodo
fuente
Puede considerar hacer su propia implementación. Manipular los fragmentos PNG es bastante sencillo. Si solo tiene la intención de aplicar un DPI en particular a todos ellos, ni siquiera necesita tener una función de suma de verificación que funcione, solo copie un pHYsfragmento prefabricado de un PNG hecho en Photoshop.
Zdenek

Respuestas:

6

¿Es 2.10 MB lo suficientemente pequeño? En caso afirmativo, use NConvert y un comando por lotes como:

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

¿Para qué sirve NConvert?

XnView es una aplicación basada en GUI, puede cambiar y manipular imágenes utilizando una interfaz gráfica de usuario. NConvert tiene aproximadamente las mismas capacidades que XnView, pero es una herramienta de línea de comandos y no tiene una interfaz gráfica de usuario. Puede usar NConvert en scripts de Batch u otra aplicación puede llamarlo.

Enlaces Útiles

  • Guía para principiantes y Wiki con algunos ejemplos para comenzar
  • Archivo de ayuda para ver qué parámetros de línea de comandos están disponibles (Cargado en pastebin)
  • Una interfaz gráfica que usa Nconvert es XnConvert . Use esto para crear y exportar archivos por lotes de Nconvert
  • Foro para Xnconvert y Nconvert para
nixda
fuente
¡Gracias, se ve genial y probablemente será útil en el futuro! En este caso, terminé estudiando el formato PNG (que afortunadamente era bastante simple) y cambiando las imágenes a través de una pequeña aplicación personalizada (15 líneas en PHP).
johndodo
@johndodo Esto suena interesante. ¿Te gustaría compartir tu aplicación con nosotros?
nixda
Desafortunadamente, no tengo la libertad de hacerlo, pero puede hacer lo mismo leyendo una especificación (¡excelente!) Del formato de archivo PNG y creando una aplicación que cambie el fragmento de pHYs . Realmente es simple una vez que sabes lo que estás haciendo.
johndodo
1

Usted mencionó que estaría ejecutando este comando "desde su aplicación", y esto me lleva a creer que ha escrito esta aplicación o la está manteniendo. Dicho esto, hay API de ImageMagick para varios idiomas, y puede usar uno de ellos para agregar la funcionalidad directamente a su programa existente. El aumento en el tamaño del paquete dependerá del idioma en el que esté escrita su aplicación y de si vincula la biblioteca de forma estática o dinámica, pero me imagino que sería significativamente menor que un aumento de 30 MB.

Otra opción es no incluir todo el paquete ImageMagick. Puede descargar el archivo Zip ImageMagick (que solo tiene 13 MB BTW), extraer solo la convertherramienta y sus dependencias y distribuirla a sus máquinas virtuales. Hay una herramienta llamada Dependency Walker que puede usar para determinar cuáles son las dependencias de la convertherramienta.

Drew Chapin
fuente
1

Use la -sizebandera en el programa netpbm pnmtopng . Las unidades utilizadas son píxeles por metro. El siguiente ejemplo establecerá newfile.png en 300 ppp.

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

Bueno, potencialmente podrías usar un script de 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")

Fuente .

Goncalo
fuente
El instalador de Python 3.3.2 (sin incluir el código fuente) es de 19.3 MB, y el instalador de Python 2.7.5 es de 15.5 MB.
Drew Chapin
55
Eso cambiará el tamaño de la imagen, no cambiará el DPI.
Bobby
0

La línea de comando "convertir" de Image Magick adecuada para esto sería usar el argumento -resample:

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