GNU/Linux >> Tutoriales Linux >  >> Linux

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

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

Linux
  1. Verifique el estado del archivo en Linux con el comando stat

  2. Lea y escriba datos desde cualquier lugar con redirección en la terminal de Linux

  3. Sugerencia rápida:convierta imágenes en la línea de comando con ImageMagick

  4. ¿Reemplazar las variables de entorno en un archivo con sus valores reales?

  5. Cambie el directorio predeterminado de un programa específico sin cambiar su ruta

Cambiar el tamaño de una imagen desde la terminal de Linux

Cómo editar un archivo sin cambiar sus marcas de tiempo en Linux

La guía definitiva para la manipulación de imágenes con ImageMagick

Asegure Linux con el archivo Sudoers

¿Por qué se escriben datos en un archivo abierto con el indicador O_APPEND, siempre se escriben al final, incluso con `lseek`?

Cambiar el orden de las líneas en un archivo