Spécifiez les unités - il me semble me souvenir d'avoir eu un problème lorsque j'ai omis cette option (bien que le DPI doive être la valeur par défaut), par exemple :
convert -units PixelsPerInch input.png -density 300 output.png
Savez-vous quels champs de données intégrés GIMP utilise pour lire la résolution - a-t-il les siens qui remplacent les champs standard utilisés par ImageMagick ? Par exemple, Photoshop utilise Photoshop:XResolution
et Photoshop:YResolution
vous devez donc les définir pour que Photoshop reconnaisse un paramètre de densité (ImageMagick ne peut pas le faire - nous utilisons ExifTool).
Notez que vous pouvez utiliser Exiftool pour lire les résolutions. Par exemple, Exiftool '-*resolution*' c.jpg
pourrait montrer
Résolution Unité :poucesX Résolution :300Y Résolution :300
Exiftool est également capable de définir des paramètres, mais comme indiqué dans la page de manuel Image::ExifTool::TagNames
, les balises supplémentaires XResolution et YResolution ne sont pas inscriptibles par Exiftool.
Je ne sais pas si ImageMagick a des options de changement de résolution, mais je serais surpris si ce n'était pas le cas. De plus, il est simple d'écrire des scripts GIMP pour automatiser des tâches comme celle-ci, et il est également possible de modifier les résolutions avec de petits programmes. Par exemple, voici un programme C (compilable via gcc setRes.c -O3 -Wall -o setRes
) qui lit les premiers octets d'un fichier jpeg, modifie les résolutions à 300 et les réécrit. Le programme tel qu'illustré utilise des constantes pour les machines little-endian, comme x86. S'il est exécuté sur une machine big-endian, il doit se terminer par un message du type Error: xyz may be not a .jpg file
, même si xyz est un fichier jpeg. Remarque, je n'ai pas testé les images résultantes via pdflatex
; vous trouveriez probablement utile de poster une question dans le 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;
}
Je n'arrivais pas à comprendre comment convaincre de convertir ajouter uniquement les métadonnées et ne pas ré-encoder mon bitmap [monochrome] ; il agrandissait le fichier> 50%.
J'ai découvert que pngcrush (pas un outil ImageMagick) peut également ajouter les métadonnées de densité. Cette ligne de commande le marque à 600 dpi et permet d'autres optimisations, ce qui a réduit la taille du fichier d'environ 10 % :
pngcrush -res 600 in.png out.png