54 votes

Je veux changer le DPI avec ImageMagick sans changer la taille réelle des données de l'image.

Dans GIMP, il existe un moyen très simple de faire ce que je veux. Je n'ai installé que le dialogue allemand, mais je vais essayer de le traduire. Il s'agit d'aller à Picture -> PrintingSize puis en ajustant les valeurs X-Resolution y Y-Resolution que je connais sous le nom de valeurs DPI. Vous pouvez également choisir le format, qui est par défaut Pixel/Inch . (En allemand, le dialogue est Bild -> Druckgröße et là X-Auflösung y Y-Auflösung )

Ok, les valeurs sont souvent 72 par défaut. Lorsque je les modifie, par exemple en 300 cela a pour effet que l'image reste la même sur l'ordinateur, mais si je l'imprime, elle sera plus petite si vous la regardez, mais tous les détails sont toujours là, juste plus petits -> elle a une résolution plus élevée sur le papier imprimé (mais une taille plus petite... ce qui me convient).

C'est ce que je fais souvent lorsque je travaille avec LaTeX, ou plus exactement avec la commande pdflatex sur une machine Ubuntu récente. Lorsque je fais le processus ci-dessus avec GIMP manuellement, tout fonctionne parfaitement. Les images apparaissent plus petites dans le PDF résultant mais avec une haute qualité d'impression.

Ce que j'essaie de faire, c'est d'automatiser le processus qui consiste à aller dans GIMP et à ajuster les valeurs DPI. Comme ImageMagick est connu pour être superbe et que je l'ai utilisé pour de nombreuses autres tâches, j'ai essayé d'atteindre mon objectif avec cet outil. Mais il ne fait tout simplement pas ce que je veux.

Après avoir essayé beaucoup de choses, je pense que c'est en fait la commande qui devrait être mon amie :

convert input.png -density 300 output.png

Cela devrait régler le DPI sur 300, comme je peux le lire partout sur le web. Cela semble fonctionner. Mais quand je vérifie le fichier, il reste le même (EDIT : ce qui est ce à quoi je m'attends, comme expliqué ci-dessus).

file input.png output.png
     input.png: PNG image data, 611 x 453, 8-bit grayscale, non-interlaced
    output.png: PNG image data, 611 x 453, 8-bit grayscale, non-interlaced

Lorsque j'utilise cette commande, j'ai l'impression qu'elle a fait ce que je voulais :

identify -verbose output.png | grep 300
    Resolution: 300x300
    PNG:pHYs                 : x_res=300, y_res=300, units=0

Il est amusant de constater que le même résultat est obtenu pour input.png ce qui me perturbe... ce ne sont peut-être pas les bons paramètres à regarder ?

Mais lorsque j'effectue le rendu de mon TeX avec pdflatex l'image est toujours grande et floue. De plus, lorsque j'ouvre à nouveau l'image avec GIMP, les valeurs DPI sont réglées sur 72 au lieu de 300 . Il n'y a donc pas eu d'effet du tout.

Quel est le problème ? Est-ce que je me trompe complètement ? Je ne peux pas me tromper à ce point puisque tout fonctionne parfaitement avec GIMP.

Merci de votre aide. Je suis également ouvert à d'autres solutions automatisées qui sont facilement réalisables sur un système Linux.

92voto

Martin Wilson Points 1663

Spécifier les unités - Je crois me souvenir que j'ai eu un problème lorsque j'ai omis cette option (bien que DPI devrait ê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 ses propres champs qui remplacent les champs standard utilisés par ImageMagick ? Par exemple, Photoshop utilise Photoshop:XResolution y Photoshop:YResolution Il faut donc les définir pour que Photoshop reconnaisse un paramètre de densité (ImageMagick ne peut pas le faire - nous utilisons ExifTool).

4voto

John Points 69

Notez que vous pouvez utiliser Exiftool pour lire les résolutions. Par exemple, il est possible d'utiliser Exiftool pour lire les résolutions, Exiftool '-*resolution*' c.jpg pourrait montrer

Unité de résolution : pouces Résolution X : 300 Résolution Y : 300

Exiftool est également capable de définir des paramètres, mais comme indiqué dans la page de manuel Image::ExifTool::TagNames les Extra Tags XResolution et YResolution ne sont pas accessibles en écriture par Exiftool.

Je ne sais pas si ImageMagick dispose d'options de changement de résolution, mais je serais surpris qu'il n'en dispose pas. De plus, il est facile d'écrire des scripts GIMP pour automatiser des tâches comme celle-ci, et il est également possible de changer 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'il est présenté utilise des constantes pour les machines little-endian, comme x86. S'il est exécuté sur une machine big-endian, il devrait 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 l'application pdflatex ; il serait sans doute utile de poser une question dans la rubrique 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;
}

4voto

Charles Boling Points 151

Je n'ai pas trouvé le moyen de convaincre convertir de n'ajouter que les métadonnées et de ne pas recoder mon image bitmap [monochrome] ; cela augmentait le fichier de plus de 50 %.

J'ai découvert que pngcrush (qui n'est pas un outil ImageMagick) peut également ajouter les métadonnées de densité. Cette ligne de commande marque 600dpi et permet d'autres optimisations, ce qui a réduit la taille du fichier de ~10% :

pngcrush -res 600 in.png out.png

-5voto

Kurt Pfeifle Points 11465

"Je veux changer le DPI avec Imagemagick sans changer la taille réelle de l'octet des données de l'image.

C'est tout à fait impossible !

Parce que :

     more "Dots per Inch" 
<==> more pixels per area 
<==> more total pixels per image 
<==> more total bytes per image

De plus, vous ne semblez pas comprendre ce qu'est le DPI en réalité :

  1. Il s'agit d'une valeur totalement abstraite qui n'a de valeur pratique que dans le contexte de la connaissance de la taille absolue de l'impression ou du rendu sur l'écran ou le moniteur :
    • Vous pouvez "imprimer" la même image de 72x72 pixels sur un carré de 1 pouce de large : la résolution de l'impression sera de 72dpi .
    • Vous pouvez également l'imprimer sur un carré d'un quart de pouce de large : la résolution de l'impression sera alors de 288dpi .
    • ( Note : Si vous l'imprimez à l'adresse 288dpi sur un carré de 1 pouce, ce n'est plus la même image : elle aura subi une extrapolation par le pilote de l'imprimante ou un autre mécanisme de filtrage, et elle sera devenue une image de 288x288 pixels au lieu d'une image de 72x72 pixels... )
  2. Les deux impressions contiendront les mêmes informations sur l'image - l'image de 288 dpi n'en contiendra pas soudainement plus.

Si vous souhaitez imprimer l'image originale de 72x72 pixels sous la forme d'un carré de 1 pouce de large, mais au format 288dpi Vous devrez alors rééchelonner l'image (dans ce cas, la mettre à l'échelle). Pour chaque pixel de l'image originale, il faut 4 pixels de la nouvelle image agrandie. Différents algorithmes peuvent être utilisés pour calculer les valeurs de couleur de ces 4 pixels (dont 3 sont de nouveaux pixels) :

  • vous pourriez leur donner la même chose que le pixel original (qui est un algorithme très "brut"),
  • ou vous pourriez faire une moyenne de la valeur de couleur du pixel original avec les valeurs de couleur des pixels voisins.

Dans tous les cas, vous créez une image plus grande composée de 288 rangées de pixels de 288 pixels de haut chacune (288x288 pixels).

Ce que Gimp fait pour vous lorsque vous passez par "Image -> Taille d'impression" : il simplifie le processus de recalcul des changements requis dans les tailles absolues de pixels, le rendant plus convivial. Pour ce faire...

  • ...il vous demande d'abord le DPI parce qu'une imprimante donnée ne peut pas modifier arbitrairement sa résolution d'impression (certaines peuvent offrir non seulement une, mais peut-être même 2 ou 3 résolutions différentes). Il vous demande donc à quelle résolution vous souhaitez imprimer. C'est la première information.
  • ...puis il demande également la deuxième information : à quelle taille (en cm , mm o inch ), l'impression doit apparaître sur le papier.

En fonction de ces deux informations, Gimp calcule le nombre total de pixels qu'il doit utiliser (extrapoler à partir du nombre de pixels d'origine) pour remplir l'espace demandé à la résolution demandée.

Cependant, la mise à l'échelle d'une image matricielle en lui faisant contenir plus de pixels n'ajoute pas d'informations réelles et ne fait qu'ajouter une "qualité" fictive. Elle peut regarder plus agréable à l'œil humain si votre algorithme de mise à l'échelle est "bon". En revanche, si vous vous contentez de doubler, tripler ou quadrupler les pixels existants, comme le font certains algorithmes simples, l'aspect sera laid.

Pour les images matricielles,
le réglage du DPI n'est pertinent que dans le contexte de l'utilisation de l'Internet. l'impression o affichage il. En effet, les imprimantes et les écrans ont des résolutions fixes. C'est pourquoi il est...

  • ...un pilote d'imprimante ou
  • ...une application de traitement d'images qui prend en charge l'impression

doivent savoir.

Et Documentation d'ImageMagick est en plein accord avec moi :

-density width
-density widthxheight
Définir la résolution horizontale et verticale d'une image pour le rendu aux appareils.

Pour les images vectorielles ou les formats de fichiers
(tels que PDF ou PostScript), le paramètre DPI est toutefois extrêmement important dans le contexte de l'utilisation de l'Internet. tramage les. Un DPI plus élevé transfère plus d'informations sur l'image dans le format de trame et préserve donc plus de détails de la qualité originale réelle. Lors de la conversion d'une image vectorielle d'une taille donnée en mm , cm o inch dans une trame avec un DPI plus élevé se traduira directement par un plus grand nombre de pixels totaux dans l'image.

De plus, ImageMagick ne prend pas en charge l'"impression" en tant que telle. Au lieu de cela, ImageMagick...

  • ...convertit les fichiers d'un format matriciel donné vers d'autres formats matriciels ;
  • ...ou il réduit ou augmente la taille des images matricielles ;
  • ...ou il modifie les valeurs de couleur selon un algorithme spécifique ;
  • ...ou il recadre les images, les superpose, les inverse, les reflète ;
  • ...et autres....

...mais pour imprimer les images manipulées, vous devez utiliser un autre programme.

Certains formats d'image (TIFF, PNG,...) permettent de stocker un paramètre DPI en interne dans leurs métadonnées.

Mais il ne s'agit que d'un attribut de type "hint" qui ne modifie pas l'image matricielle sous-jacente. C'est la raison pour laquelle vous avez fait cette découverte :

"Lorsque je vérifie le dossier, il reste inchangé.

Cet "indice" peut éventuellement être évalué automatiquement par les pilotes d'imprimante ou par des programmes de création de pages tels que LaTeX. En l'absence de tels "indices" DPI (ou s'ils ne se présentent pas de la manière attendue par LaTeX), LaTeX devrait toujours être en mesure de commander le rendu d'une image donnée sur une page de la manière attendue - il suffit d'un peu de code LaTeX plus explicite autour de l'image !

Certains autres formats d'image (JPEG( ?), BMP,...) ne permettent même pas de stocker un indice DPI dans leurs métadonnées internes.

Gimp ne prend donc en charge ce que vous voyez qu'il fait avec "Picture -> Printing Size" que parce qu'il veut imprimer une image. Avec ImageMagick, il n'est pas possible d'imprimer.

Continuez à faire ce que vous voulez avec Gimp lorsque vous imprimez. Cela n'a pas de sens avec ImageMagick.

Voir aussi cet extrait supplémentaire de la documentation de l'IM qui explique le même sujet avec des mots différents.


Il ne reste donc plus que ceci :

  • Si vous "manipulez" votre image avec Gimp, puis intégrez le résultat dans LaTeX, la page ressemble à ce que vous attendez d'elle.
  • Si vous "manipulez" votre image avec ImageMagick, puis intégrez le résultat dans LaTeX, la page se présente comme suit pas comme vous l'attendez.

Veuillez fournir les éléments suivants pour résoudre le problème susmentionné :

  • la version exacte de votre installation d'ImageMagick (sortie complète de convert -version y convert -list configure ) ;
  • (un lien vers un) échantillon d'image original ;
  • (un lien vers la) même image manipulée par Gimp ;
  • (un lien vers la) même image manipulée par ImageMagick.

Nous pourrons ainsi contribuer à résoudre le problème.

Mais attention : il s'agit d'un problème différent de celui posé par votre sujet/titre actuel : "Je veux changer le DPI avec Imagemagick sans changer la taille réelle de l'octet des données de l'image.


Mise à jour

Puisqu'il s'agit encore Si certains lecteurs ne comprennent pas ce que j'ai noté ci-dessus, voici une nouvelle tentative...

Tout ce qui est noté comme Résolution o Densité à l'intérieur d'un fichier image, est un attribut de métadonnées . Il n'a aucune influence sur le nombre de pixels réels décrits par le fichier et n'est absolument pas pertinent à cet égard. Il s'agit simplement d'un indice qu'un dispositif d'impression ou de rendu ou une application peut ou non à suivre lors de l'impression, du rendu ou de l'affichage de l'image.

À cette fin, il s'agit simplement de quelques chiffres stockés dans le fichier image. Ces nombres indiquent aux périphériques de sortie tels que les imprimantes et les écrans combien de points (ou pixels) par pouce l'image doit être affichée. Pour les formats vectoriels tels que PostScript, PDF, MWF et SVG, il indique l'échelle des pixels pour dessiner toutes les coordonnées du monde réel utilisées par l'image.

Par exemple, lorsque la valeur de résolution notée par ImageMagick dans les métadonnées de l'image est la suivante PAS honoré par une application est Adobe Photoshop. Photoshop stocke ses indications sur la résolution d'impression ou d'affichage souhaitée dans un profil propriétaire nommé 8bim . ImageMagick ne touche pas à ce profil, même lorsqu'on lui demande d'écrire un changement de résolution dans les métadonnées d'un fichier image. Photoshop, en revanche, ignorera toutes les indications de résolution stockées par ImageMagick dans le champ de métadonnées standard défini à cet effet, dès qu'il verra son propre profil de résolution. 8bim profil.

L'OP aurait dû choisir le titre :

  • Je souhaite modifier le DPI (indice de résolution des métadonnées) avec ImageMagick sans modifier le nombre réel de pixels dans l'image.

afin d'éviter tout malentendu...

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X