Especifique las unidades:creo recordar que tuve un problema cuando omití esta opción (aunque DPI debería ser el valor predeterminado), por ejemplo:
convert -units PixelsPerInch input.png -density 300 output.png
¿Sabe qué campos de datos incrustados usa GIMP para leer la resolución? ¿Tiene uno propio que anule los estándares usados por ImageMagick? Por ejemplo, Photoshop usa 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 usar Exiftool para leer resoluciones. Por ejemplo, Exiftool '-*resolution*' c.jpg
podría mostrar
Unidad de resolución:pulgadasX Resolución:300Y Resolución:300
Exiftool también puede establecer parámetros, pero como se indica en la página man 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 si no las tuviera. Además, es sencillo escribir secuencias de comandos GIMP para automatizar tareas como esta, y también es posible cambiar las resoluciones con pequeños programas. Por ejemplo, el siguiente es un programa 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 encontrará que vale la pena 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 %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;
}
No pude averiguar cómo convencer a convertir agregar solo los metadatos y no volver a codificar mi mapa de bits [monocromo]; estaba expandiendo el archivo>50%.
Descubrí que pngcrush (no es una herramienta ImageMagick) también puede agregar los metadatos de densidad. Esta línea de comando marca 600 ppp y permite otras optimizaciones, lo que redujo el tamaño del archivo en ~10 %:
pngcrush -res 600 in.png out.png