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