Saltar al contenido

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

Solución:

Especifique las unidades: creo recordar que tuve un problema cuando omití esta opción (aunque DPI debería ser el predeterminado), 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 uno propio que anule los estándar utilizados por ImageMagick? Por ejemplo, Photoshop utiliza Photoshop:XResolution y Photoshop:YResolution por lo que debe configurarlos para que Photoshop reconozca una configuración de densidad (ImageMagick no puede hacer esto, usamos ExifTool).

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

Unidad de resolución: pulgadas Resolución X: 300 Y Resolución: 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 de cambio de resolución, pero me sorprendería si no las tuviera. Además, es sencillo escribir scripts GIMP para automatizar tareas como esta, y también es posible cambiar resoluciones con programas pequeños. Por ejemplo, a continuación se muestra un programa en C (compilable a través de 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 como se muestra usa 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 xyz es un archivo jpeg. Tenga en cuenta que no he probado las imágenes resultantes a través de pdflatex; probablemente le resulte útil publicar una pregunta en tex 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 %sn", 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;
}

No pude averiguar cómo convencer convertir para agregar solo los metadatos y no volver a codificar mi [monochrome] mapa de bits estaba expandiendo el archivo> 50%.

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

pngcrush -res 600 in.png out.png
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *