GNU/Linux >> Linux Esercitazione >  >> Linux

Voglio cambiare DPI con ImageMagick senza modificare la dimensione effettiva in byte dei dati dell'immagine

Specifica le unità:mi sembra di ricordare di aver avuto un problema quando ho omesso questa opzione (sebbene DPI dovrebbe essere l'impostazione predefinita), ad esempio:

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

Sai quali campi di dati incorporati GIMP utilizza per leggere la risoluzione:ne ha uno proprio che sovrascrive quelli standard utilizzati da ImageMagick? Ad esempio, Photoshop utilizza Photoshop:XResolution e Photoshop:YResolution quindi devi impostarli affinché Photoshop riconosca un'impostazione di densità (ImageMagick non può farlo:usiamo ExifTool).


Si noti che è possibile utilizzare Exiftool per leggere le risoluzioni. Ad esempio, Exiftool '-*resolution*' c.jpg potrebbe mostrare

Unità di risoluzione :polliciX Risoluzione :300Y Risoluzione :300

Exiftool è anche in grado di impostare i parametri, ma come indicato nella pagina man Image::ExifTool::TagNames , gli Extra Tag XResolution e YResolution non sono scrivibili da Exiftool.

Non so se ImageMagick abbia opzioni di modifica della risoluzione, ma sarei sorpreso se non fosse così. Inoltre, è semplice scrivere script GIMP per automatizzare attività come questa, ed è anche possibile modificare le risoluzioni con piccoli programmi. Ad esempio, il seguente è un programma C (compilabile tramite gcc setRes.c -O3 -Wall -o setRes ) che legge i primi pochi byte di un file jpeg, cambia la risoluzione a 300 e li riscrive. Il programma come mostrato usa costanti per macchine little-endian, come x86. Se eseguito su una macchina big-endian dovrebbe terminare con un messaggio come Error: xyz may be not a .jpg file , anche se xyz è un file jpeg. Nota, non ho testato le immagini risultanti tramite pdflatex; probabilmente troveresti utile postare una domanda nel 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;
}

Non sono riuscito a capire come convincere convert aggiungere solo i metadati e non ricodificare la mia bitmap [monocromatica]; stava espandendo il file>50%.

Ho scoperto che pngcrush (non uno strumento ImageMagick) può anche aggiungere i metadati di densità. Questa riga di comando lo contrassegna a 600 dpi e consente altre ottimizzazioni, che hanno ridotto le dimensioni del file di circa il 10%:

pngcrush -res 600 in.png out.png

Linux
  1. Controlla lo stato del file su Linux con il comando stat

  2. Leggi e scrivi dati da qualsiasi luogo con reindirizzamento nel terminale Linux

  3. Iniziare con il comando tac di Linux

  4. Suggerimento rapido:converti le immagini dalla riga di comando con ImageMagick

  5. Come elencare l'ennesimo file più giovane (senza analizzare Ls!)?

Ridimensiona un'immagine dal terminale Linux

Come modificare un file senza modificarne i timestamp in Linux

La guida definitiva alla manipolazione delle immagini con ImageMagick

Proteggi Linux con il file Sudoers

Perché i dati vengono scritti in un file aperto con il flag O_APPEND, sempre scritto alla fine, anche con `lseek`?

Modificare l'ordine delle righe in un file