Quiero cambiar DPI con ImageMagick sin cambiar el tamaño de bytes real de los datos de la imagen

Quiero cambiar DPI con ImageMagick sin cambiar el tamaño de bytes real de los datos de la imagen

En GIMP hay una forma muy sencilla de hacer lo que quiero. Sólo tengo instalado el diálogo en alemán pero intentaré traducirlo. Estoy hablando de ir Picture -> PrintingSizey luego ajustar los valores X-Resolutionque Y-Resolutionconozco como los llamados valores DPI. También puedes elegir el formato que por defecto es Pixel/Inch. (En alemán el diálogo es Bild -> Druckgrößey ahí X-Auflösungy Y-Auflösung)

Ok, los valores que aparecen suelen ser 72los predeterminados. Cuando los cambio, por ejemplo, 300esto tiene el efecto de que la imagen permanece igual en la computadora, pero si la imprimo, será más pequeña si la miras, pero todos los detalles siguen ahí, solo que más pequeños -> tiene una resolución más alta en el papel impreso (pero de menor tamaño... lo cual está bien para mí).

A menudo hago esto cuando trabajo con LaTeX, o para ser exactos con el comando pdflatexen una máquina Ubuntu reciente. Cuando hago el proceso anterior con GIMP manualmente, todo funciona bien. Las imágenes aparecerán más pequeñas en el PDF resultante pero con alta calidad de impresión.

Lo que intento hacer es automatizar el proceso de ingresar a GIMP y ajustar los valores de DPI. Como se sabe que ImageMagick es excelente y lo usé para muchas otras tareas, intenté lograr mi objetivo con esta herramienta. Pero simplemente no hace lo que quiero.

Después de probar muchas cosas, creo que este es el comando que debería ser mi amigo:

convert input.png -density 300 output.png

Esto debería establecer el DPI en 300, como puedo leer en todas partes de la web. Parece funcionar. Cuando reviso el archivo, permanece igual (EDITAR: que es lo que espero, como se explicó anteriormente).

file input.png output.png
     input.png: PNG image data, 611 x 453, 8-bit grayscale, non-interlaced
    output.png: PNG image data, 611 x 453, 8-bit grayscale, non-interlaced

Cuando uso este comando, parece que hizo lo que quería:

identify -verbose output.png | grep 300
    Resolution: 300x300
    PNG:pHYs                 : x_res=300, y_res=300, units=0

(Curiosamente, aparece el mismo resultado, input.pnglo que me confunde... ¿entonces estos podrían ser los parámetros incorrectos a observar?)

Perocuando ahora renderizo mi TeX con pdflatexla imagen todavía es grande y borrosa. Además, cuando abro la imagen con GIMP nuevamente, los valores de DPI se configuran 72en lugar de 300. Así que en realidad no hubo ningún efecto.

Ahora cuál es el problema aquí. ¿Estoy entendiendo algo completamente mal? No puedo estar tan equivocado ya que todo funciona bien con GIMP.

Gracias por cualquier ayuda en esto. También estoy abierto a otras soluciones automatizadas que se pueden realizar fácilmente en un sistema Linux.

Respuesta1

Especifique las unidades. Creo recordar que tuve un problema cuando omití esta opción (aunque DPI debería ser la opción predeterminada), por ejemplo:

convert -units PixelsPerInch input.png -density 300 output.png

¿Sabe qué campos de datos incrustados utiliza GIMP para leer la resolución? ¿Tiene los suyos propios que anulan los estándar utilizados por ImageMagick? Por ejemplo, Photoshop los usa Photoshop:XResolutiony, Photoshop:YResolutionpor lo tanto, debe configurarlos para que Photoshop reconozca una configuración de densidad (ImageMagick no puede hacer esto; usamos ExifTool).

Respuesta2

No pude encontrar la manera de convencerconvertiragregar solo los metadatos y no volver a codificar mi mapa de bits [monocromo]; estaba expandiendo el archivo> 50%.

descubrí quepngaplastar(no es una herramienta ImageMagick) también puede agregar los metadatos de densidad. Esta línea de comando lo marca 600 ppp y permite otras optimizaciones, lo que redujo el tamaño del archivo en ~10%:

pngcrush -res 600 in.png out.png

Respuesta3

Tenga en cuenta que puede utilizar Exiftool para leer resoluciones. Por ejemplo, Exiftool '-*resolution*' c.jpgpodría mostrar

Unidad de resolución: pulgadas Resolución X: 300 Resolución Y: 300

Exiftool también puede establecer parámetros, pero como se indica en la página de manual Image::ExifTool::TagNames, Exiftool no puede escribir en las etiquetas adicionales XResolution e YResolution.

No sé si ImageMagick tiene opciones para cambiar la resolución, pero me sorprendería que no las tuviera. Además, es sencillo escribir scripts GIMP para automatizar tareas como esta y también es posible cambiar las resoluciones con pequeños programas. Por ejemplo, a continuación se muestra un programa en C (compilable mediante gcc setRes.c -O3 -Wall -o setRes) que lee los primeros bytes de un archivo jpeg, cambia las resoluciones a 300 y las reescribe. El programa que se muestra utiliza constantes para máquinas little-endian, como x86. Si se ejecuta en una máquina big-endian debería terminar con un mensaje como Error: xyz may be not a .jpg file, incluso si xyzesun archivo jpeg. Tenga en cuenta que no he probado las imágenes resultantes mediante pdflatex; Probablemente le resulte útil publicar una pregunta en eltex SE.

/* jiw -- 24 Sep 2012 -- Re: set resolution in a jpg -- Offered without
warranty under GPL v3 terms as at http://www.gnu.org/licenses/gpl.html
*/
#include <stdlib.h>
#include <stdio.h>
void errorExit(char *msg, char *par, int fe) {
  fprintf (stderr, "\n%3d Error: %s %s\n", fe, msg, par);
  exit (1);
}
// Note, hex constants are byte-reversed on little vs big endian machines
enum { JF=0x464a, IF=0x4649, L300=0x2c01, B300=0x012c, NEWRES=L300};
int main(int argc, char *argv[]) {
  FILE *fi;
  short int buf[9];
  int r, L=sizeof buf;
  if (argc<2) errorExit(argv[0], "requires a .jpg file name", 0);
  fi = fopen(argv[1], "r+b");
  if(!fi) errorExit("open failed for", argv[1], ferror(fi));
  r = fread(buf, 1, L, fi);
  if (r != L) errorExit("read failed for", argv[1], ferror(fi));
  if (buf[3] != JF || buf[4] != IF) // Check JFIF signature
    errorExit(argv[1], "may be not a .jpg file", 0);
  buf[7] = buf[8] = NEWRES;
  fseek(fi, 0, SEEK_SET);
  r = fwrite(buf, 1, L, fi);
  if (r != L) errorExit("write failed for", argv[1], ferror(fi));
  return 0;
}

Respuesta4

"Quiero cambiar DPI con Imagemagick sin cambiar el tamaño de bytes real de los datos de la imagen".

¡Esto es completamente imposible!

Porque:

     more "Dots per Inch" 
<==> more pixels per area 
<==> more total pixels per image 
<==> more total bytes per image

Además, parece que no entiendes qué es el DPI en realidad:

  1. Es un valor completamente abstracto que adquiere valor práctico sólo en el contexto de conocer también el tamaño absoluto de la impresión o la representación en la pantalla o monitor:
    • Puede "imprimir" la misma imagen de 72x72 píxeles en un cuadrado de 1 pulgada de ancho: la impresión tendrá una resolución de 72dpi.
    • También puedes 'imprimirlo' en un cuadrado de 1/4 de pulgada de ancho: entonces la impresión tendrá una resolución de 288dpi.
    • (Nota: Si lo 'imprime' en 288dpiun cuadrado de 1 pulgada, ya no será la misma imagen: habrá sufrido alguna extrapolación a través del controlador de la impresora o algún otro mecanismo de filtrado, y se habrá convertido en una imagen de 288x288 píxeles en lugar de una Imagen de 72x72 píxeles...)
  2. Ambas impresiones tendrán la misma información de imagen: la imagen de 288 ppp de repente no tendrá más.

Si desea imprimir la imagen original de 72x72 píxeles como un cuadrado de 1 pulgada de ancho, pero en 288dpi, tendrá quereescalarla imagen (en este caso ampliándola). Por cada píxel del original, necesitarás 4 píxeles de la imagen nueva mejorada. Ahora existen diferentes algoritmos que se pueden utilizar para calcular qué valores de color deben tener estos 4 píxeles (3 de ellos nuevos píxeles):

  • podrías darles lo mismo que el píxel original (que es un algoritmo muy "en bruto",
  • o podría promediar el valor de color del píxel original con los valores de color de los píxeles vecinos.

En cualquier caso, está creando una imagen más grande que consta de 288 filas de píxeles, cada una de las cuales tiene 288 píxeles de alto (288x288 píxeles).

Lo que Gimp hace por usted cuando pasa por "Imagen -> Tamaño de impresión": simplifica el proceso de volver a calcular los cambios requeridos en tamaños absolutos de píxeles, haciéndolo más fácil de usar. Para este propósito...

  • ...primero le pregunta sobre el DPI porque una determinada impresora no puede cambiar su resolución de impresión arbitrariamente (algunas pueden ofrecer no sólo una, sino incluso 2 o 3 resoluciones diferentes). Entonces te pregunta a qué resolución quieres imprimir. Esa es la primera información.
  • ... luego también solicita la segunda información: en qué tamaño (en cm, mmo inch) debe aparecer la impresión en papel.

De acuerdo con estos dos datos, Gimp calcula el número total de píxeles que debe usar (extrapolando del número original de píxeles) para llenar el espacio solicitado con la resolución solicitada.

Sin embargo, ampliar una imagen rasterizada haciéndola contener más píxeles no le agrega información real y solo le agrega "calidad", que es ficticia. PuedemirarEs más agradable para el ojo humano si su algoritmo de ampliación es "bueno". Y se verá feo si simplemente duplicas, triplicas o cuadriplicas los píxeles existentes, como lo hacen algunos algoritmos simples.

Para imágenes rasterizadas,
La configuración DPI sólo es relevante en el contexto deimpresiónomostrandoél. Porque las impresoras o los monitores han dado resoluciones fijas. Por lo tanto es información que sólo...

  • ...un controlador de impresora o
  • ...una aplicación de procesamiento de imágenes que admite la impresión

necesito saber.

YDocumentación de ImageMagickestá totalmente de acuerdo conmigo:

-density width
-density widthxheight
Establecer la resolución horizontal y vertical de una imagen para renderizado a dispositivos.

Para imágenes vectoriales o formatos de archivo
(como PDF o PostScript), sin embargo, la configuración de DPI es extremadamente importante en el contexto derasterizara ellos. Un DPI más alto transferirá más información de la imagen al formato rasterizado y, por lo tanto, preservará más detalles de la calidad original real. Al convertir una imagen vectorial de un tamaño determinado en mm, cmo inchen ráster con un DPI más alto, se traducirá directamente en una mayor cantidad de píxeles totales en la imagen.

Además, ImageMagick no admite la "impresión" como tal. En cambio, ImageMagick sólo...

  • ...convierte archivos de un formato ráster determinado a otros formatos ráster;
  • ...o reduce o aumenta la escala de las imágenes rasterizadas;
  • ...o cambia los valores de color según un algoritmo específico;
  • ...o recorta imágenes, las superpone, las invierte, las refleja;
  • ...Y qué no....

...pero para imprimir las imágenes manipuladas es necesario utilizar un programa diferente.

Algunos formatos de imagen (TIFF, PNG,...) admiten el almacenamiento de una configuración de DPI internamente en sus metadatos.

Pero esto no es más que un atributo de "pista" que no altera la imagen rasterizada subyacente. Esa es la razón por la que hiciste este descubrimiento:

"Cuando reviso el archivo, sigue igual".

Esta "pista" posiblemente pueda ser evaluada automáticamente por los controladores de impresora o por programas de creación de páginas como LaTeX. En ausencia de tales 'sugerencias' de DPI (o si de alguna manera no se presentan de la manera que LaTeX espera que lo hagan), aún se debería poder ordenar a LaTeX que represente cualquier imagen determinada en una página de la manera que uno espera. para... ¡sólo necesita un código LaTeX más explícito alrededor de la imagen!

Algunos otros formatos de imagen (JPEG(?), BMP,...) ni siquiera admiten el almacenamiento de una pista de DPI en sus metadatos internos.

Entonces, Gimp solo admite lo que ve que está haciendo con "Imagen -> Tamaño de impresión" porque quiere imprimir una imagen. Con ImageMagick no puedes imprimir.

Sigue haciendo lo que quieras con Gimp cuando imprimas. No tiene sentido con ImageMagick.

Ver tambiéneste fragmento de documentación adicional de mensajería instantánea, que explica el mismo tema con diferentes palabras.


Entonces lo que queda es esto:

  • Si 'manipulas' tu imagen con Gimp y luego incrustas el resultado en LaTeX, la página se verá como esperabas.
  • Si 'manipulas' tu imagen con ImageMagick y luego incrustas el resultado en LaTeX, la página se veránocomo esperas.

Proporcione lo siguiente para resolver el problema anterior:

  • la versión exacta de su instalación de ImageMagick (resultado completo de convert -versiony convert -list configure);
  • (un enlace a una) imagen de muestra original;
  • (un enlace a la) misma imagen manipulada por Gimp;
  • (un enlace a la) misma imagen manipulada por ImageMagick.

De esta manera podemos ayudar a resolver el problema.

Pero tenga en cuenta: este es un problema diferente de lo que plantea su tema/título actual:"Quiero cambiar DPI con Imagemagick sin cambiar el tamaño de bytes real de los datos de la imagen"


Actualizar

Ya que esaúnNo está claro para algunos lectores lo que señalé anteriormente, aquí hay un intento más...

Lo que sea que se indique como'Resolución'o'Densidad'dentro de un archivo de imagen, hay unatributo de metadatos. No influye en el número de píxeles reales descritos por el archivo y es completamente irrelevante a este respecto. es solo unpistaque un dispositivo de impresión o renderizado o una aplicación puedeo no puedesiga al imprimir, renderizar o mostrar la imagen.

Para ello, son sólo unos pocos números almacenados en el archivo de imagen. Estos números indican a los dispositivos de salida, como impresoras y pantallas, cuántos puntos (o píxeles) por pulgada debe mostrarse la imagen. Para formatos vectoriales como PostScript, PDF, MWF y SVG, le indica a la escala de píxeles que dibuje las coordenadas del mundo real utilizadas por la imagen.

Un ejemplo, donde el valor de resolución anotado por ImageMagick dentro de los metadatos de la imagen esNOUna aplicación honrada es Adobe Photoshop. Photoshop almacena sus sugerencias sobre la resolución de impresión o visualización deseada en un perfil propietario llamado8bim. ImageMagick no toca este perfil, incluso cuando se le pide que escriba un cambio de resolución en los metadatos de un archivo de imagen. Photoshop, por otro lado, ignorará todos los consejos de resolución almacenados por ImageMagick en el campo de metadatos estándar definido para este propósito tan pronto como vea los suyos propios.8bimperfil.

El OP debería haber elegido el título:

  • 'Quiero cambiar DPI (sugerencia de resolución de metadatos) con ImageMagick sin cambiar la cantidad real de píxeles de la imagen'

para evitar todos los malentendidos...

información relacionada