⚠️ Ceci est un site de traduction non officiel, sans lien avec ImageMagick Studio LLC. Pour des informations officielles, consultez la page originale (https://imagemagick.org/porting/).

ImageMagick Version 7 • Imagerie à haute gamme dynamique • Canaux de pixel • Alpha • Niveaux de gris • Masques • API MagickCore • Fichiers d'en-tête • Fonctionnalités obsolètes supprimées • Interface en ligne de commande • Améliorations de performance • Résumé des changements de la version 7

La conception d'ImageMagick est un processus évolutif, où les efforts de conception et d'implémentation s'influencent et se guident mutuellement vers de nouveaux progrès. Avec ImageMagick version 7, nous avons amélioré la conception en nous appuyant sur les leçons tirées de l'implémentation de la version 6. ImageMagick a été conçu à l'origine pour afficher des images RGB sur un serveur X Windows. Au fil du temps, nous avons étendu la prise en charge aux images RGBA, puis aux formats d'image CMYK et CMYKA. Avec ImageMagick version 7, nous étendons la prise en charge à des espaces colorimétriques arbitraires comportant un nombre arbitraire de canaux de pixel. De plus, ImageMagick 7 stocke les canaux de pixel sous forme de flottants, ce qui autorise des valeurs hors limites (par exemple négatives) et réduit les erreurs d'arrondi. De nombreuses autres améliorations de conception sont décrites dans ce document.

Pour prendre en charge des canaux de pixel variables dans l'API MagickCore, la gestion des pixels a changé lors de la lecture ou de l'écriture des canaux de pixel. Vous pouvez accéder aux canaux sous forme de tableau, pixel[i], ou utiliser une méthode d'accès telle que GetPixelRed() ou SetPixelRed(). Il y a quelques modestes changements dans les API MagickCore et MagickWand. Les API Magick++ et PerlMagick n'ont pas changé et correspondent à celles d'ImageMagick version 6.

L'API shell (ligne de commande) d'ImageMagick version 7 a fait l'objet d'une refonte majeure, avec un accent particulier sur la capacité à lire les « options » non seulement depuis la ligne de commande, mais aussi depuis des scripts et des flux de fichiers. Cela permet d'employer des techniques de programmation par « co-traitement » ou de réaliser le traitement d'images à l'aide de « backends démon/serveur », voire un traitement distribué multi-machines.

La refonte de l'API shell s'est accompagnée d'autres améliorations, notamment : un meilleur signalement de l'option ayant échoué, la consolidation et l'obsolescence d'options, et un usage plus global des « propriétés d'image » (plus communément appelées « échappements en pourcentage ») dans les arguments d'option.

ImageMagick version 7 est désormais disponible en tant que version de production.

Maintenant qu'ImageMagick version 7 est publiée, nous continuons à prendre en charge la version 6 pendant au moins 10 ans. La prise en charge de la version 6 se limite principalement aux corrections de bogues et aux correctifs de sécurité, avec peu d'améliorations.

Imagerie à haute gamme dynamique

ImageMagick version 7 active par défaut l'imagerie à haute gamme dynamique (HDRI). Le HDRI représente avec précision la large plage de niveaux d'intensité que l'on trouve dans des scènes réelles, allant de la lumière directe du soleil la plus vive aux ombres les plus profondes et les plus sombres. De plus, les résultats du traitement d'images sont plus précis. L'inconvénient est qu'il nécessite plus de mémoire et peut entraîner des temps de traitement plus longs. Si vous constatez des différences entre les résultats de votre ligne de commande en version 6 et en version 7, c'est probablement dû au HDRI. Vous devrez peut-être ajouter -clamp à votre ligne de commande pour contraindre les pixels à la plage 0 .. QuantumRange, ou désactiver le HDRI lors de la compilation d'ImageMagick version 7. Pour désactiver le HDRI (recommandé pour les compilations destinées aux smartphones telles qu'iOS ou pour les sites de production où la performance est primordiale), ajoutez simplement --disable-hdri à la ligne de commande du script configure lors de la compilation d'ImageMagick.

Canaux de pixel

Un pixel est composé d'une ou plusieurs valeurs de couleur, ou canaux (par exemple le canal de pixel rouge).

Les versions antérieures d'ImageMagick (4-6) prennent en charge 4 à 5 canaux de pixel (RGBA ou CMYKA). Les 4 premiers canaux sont accédés via la structure de données PixelPacket. Cette structure comprend 4 membres de type Quantum (généralement 16 bits) : rouge, vert, bleu et opacité. Le canal noir ou les index de la palette de couleurs sont pris en charge par une méthode et une structure distinctes, IndexPacket. À titre d'exemple, voici un extrait de code d'ImageMagick version 6 qui inverse les composantes de couleur (mais pas la composante alpha) des pixels de l'image :

for (y=0; y < (ssize_t) image->rows; y++)
{
  IndexPacket
    *indexes;

  PixelPacket
    *q;

  q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
  if (q == (PixelPacket *) NULL)
    {
      status=MagickFalse;
      continue;
    }
  indexes=GetCacheViewAuthenticIndexQueue(image_view);
  for (x=0; x < (ssize_t) image->columns; x++)
  {
    if ((channel & RedChannel) != 0)
      q->red=(Quantum) QuantumRange-q->red;
    if ((channel & GreenChannel) != 0)
      q->green=(Quantum) QuantumRange-q->green;
    if ((channel & BlueChannel) != 0)
      q->blue=(Quantum) QuantumRange-q->blue;
    if (((channel & IndexChannel) != 0) &&
        (image->colorspace == CMYKColorspace))
      indexes[x]=(IndexPacket) QuantumRange-indexes[x];
    q++;
  }
  if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
    status=MagickFalse;
}

ImageMagick version 7 prend en charge un nombre quelconque de canaux de 1 à 64 (et au-delà) et simplifie l'accès grâce à une méthode unique qui renvoie un tableau de canaux de pixel de type Quantum. Le code source compilé avec des versions antérieures d'ImageMagick nécessite un remaniement pour fonctionner avec ImageMagick version 7. Illustrons cela par un exemple. Remanions naïvement l'extrait de code de la version 6 ci-dessus pour qu'il fonctionne avec l'API d'ImageMagick version 7 :

for (y=0; y < (ssize_t) image->rows; y++)
{
  Quantum
    *q;

  q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
  if (q == (Quantum *) NULL)
    {
      status=MagickFalse;
      continue;
    }
  for (x=0; x < (ssize_t) image->columns; x++)
  {
    if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0)
      SetPixelRed(image,QuantumRange-GetPixelRed(image,q),q);
    if ((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0)
      SetPixelGreen(image,QuantumRange-GetPixelGreen(image,q),q);
    if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0)
      SetPixelBlue(image,QuantumRange-GetPixelBlue(image,q),q);
    if ((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0)
      SetPixelBlack(image,QuantumRange-GetPixelBlack(image,q),q);
    if ((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0)
      SetPixelAlpha(image,QuantumRange-GetPixelAlpha(image,q),q);
    q+=GetPixelChannels(image);
  }
  if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
    status=MagickFalse;
}

Recommençons, mais cette fois en tirant pleinement parti de la nouvelle prise en charge des canaux de pixel variables :

for (y=0; y < (ssize_t) image->rows; y++)
{
  Quantum
    *q;

  q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
  if (q == (Quantum *) NULL)
    {
      status=MagickFalse;
      continue;
    }
  for (x = 0; x < (ssize_t) image->columns; x++)
  {
    ssize_t
      i;

    if (GetPixelWriteMask(image,q) <= (QuantumRange/2))
      {
        q+=GetPixelChannels(image);
        continue;
      }
    for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
    {
      PixelChannel channel = GetPixelChannelChannel(image,i);
      PixelTrait traits = GetPixelChannelTraits(image,channel);
      if ((traits & UpdatePixelTrait) == 0)
        continue;
      q[i]=QuantumRange-q[i];
    }
    q+=GetPixelChannels(image);
  }
  if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
    status=MagickFalse;
}

Notez comment nous utilisons GetPixelChannels() pour avancer jusqu'à l'ensemble suivant de canaux de pixel.

Les index de la palette de couleurs et le canal de pixel noir (pour l'espace colorimétrique CMYK) ne sont plus stockés dans le canal d'index, auparavant accédé avec GetAuthenticIndexQueue() et GetCacheViewAuthenticIndexQueue(). Ils constituent désormais un canal de pixel de première classe, accédé en tant que membre du tableau de pixels (par exemple pixel[4]) ou à l'aide des méthodes d'accès pratiques GetPixelIndex(), SetPixelIndex(), GetPixelBlack() et SetPixelBlack().

En conséquence de l'utilisation d'une structure de tableau pour les canaux de pixel variables, les compilateurs à auto-vectorisation disposent d'occasions supplémentaires d'accélérer les boucles sur les pixels.

Le canal sync dans IMv6 était en réalité un drapeau plutôt qu'un canal. Dans IMv7, nous utilisons à la place un drapeau : -define compose:sync=false.

Accesseurs de pixel

Vous pouvez accéder à un canal de pixel sous forme d'éléments de tableau (par exemple pixel[1]) ou utiliser des accesseurs pratiques pour lire ou définir les canaux de pixel :

GetPixela()                  SetPixela()
GetPixelAlpha()              SetPixelAlpha()
GetPixelb()                  SetPixelb()
GetPixelBlack()              SetPixelBlack()
GetPixelBlue()               SetPixelBlue()
GetPixelCb()                 SetPixelCb()
GetPixelCr()                 SetPixelCr()
GetPixelCyan()               SetPixelCyan()
GetPixelGray()               SetPixelGray()
GetPixelGreen()              SetPixelGreen()
GetPixelIndex()              SetPixelIndex()
GetPixelL()                  SetPixelL()
GetPixelMagenta()            SetPixelMagenta()
GetPixelReadMask()           SetPixelReadMask()
GetPixelWriteMask()          SetPixelWriteMask()
GetPixelMetacontentExtent()  SetPixelMetacontentExtent()
GetPixelOpacity()            SetPixelOpacity()
GetPixelRed()                SetPixelRed()
GetPixelYellow()             SetPixelYellow()
GetPixelY()                  SetPixelY()

Vous trouverez ces accesseurs définis dans le fichier d'en-tête MagickCore/pixel-accessor.h

Traits de pixel

Chaque canal de pixel inclut un ou plusieurs de ces traits :

Undefined
aucun trait associé à ce canal de pixel
Copy
ne pas mettre à jour ce canal de pixel, simplement le copier
Update
mettre à jour ce canal de pixel
Blend
fondre ce canal de pixel avec le masque alpha s'il est activé

Nous fournissons ces méthodes pour définir et lire les traits de pixel :

GetPixelAlphaTraits()    SetPixelAlphaTraits()
GetPixelBlackTraits()    SetPixelBlackTraits()
GetPixelBlueTraits()     SetPixelBlueTraits()
GetPixelCbTraits()       SetPixelCbTraits()
GetPixelChannelTraits()  SetPixelChannelTraits()
GetPixelCrTraits()       SetPixelCrTraits()
GetPixelGrayTraits()     SetPixelGrayTraits()
GetPixelGreenTraits()    SetPixelGreenTraits()
GetPixelIndexTraits()    SetPixelIndexTraits()
GetPixelMagentaTraits()  SetPixelMagentaTraits()
GetPixelRedTraits()      SetPixelRedTraits()
GetPixelYellowTraits()   SetPixelYellowTraits()
GetPixelYTraits()        SetPixelYTraits()

Par commodité, vous pouvez définir le trait actif pour un ensemble de canaux de pixel à l'aide d'un masque de canal et de cette méthode :

SetImageChannelMask()

Auparavant, les méthodes MagickCore avaient des analogues par canal, par exemple NegateImage() et NegateImageChannels(). Les méthodes analogues par canal ne sont plus nécessaires, car les traits de canal de pixel spécifient s'il faut agir sur un canal de pixel particulier ou s'il faut le fondre avec le masque alpha. Par exemple, au lieu de

NegateImageChannel(image,channel);

nous utilisons :

channel_mask=SetImageChannelMask(image,channel);
NegateImage(image,exception);
(void) SetImageChannelMask(image,channel_mask);

Canaux de pixel utilisateur

En version 7, nous introduisons les canaux de pixel utilisateur. Traditionnellement, nous utilisons 4 canaux : rouge, vert, bleu et alpha. Pour le CMYK, nous avons aussi un canal noir. Les canaux utilisateur sont conçus pour contenir toute information de canal supplémentaire pertinente pour votre application. Quelques exemples : des canaux supplémentaires dans les images TIFF ou PSD, ou peut-être avez-vous besoin d'un canal contenant des informations infrarouges pour le pixel. Vous pouvez associer des traits aux canaux utilisateur afin que, lorsqu'ils sont traités par un algorithme de traitement d'image (par exemple un flou), les pixels soient copiés, traités par l'algorithme, ou même fondus avec le canal alpha si cela a du sens.

Métacontenu de pixel

En version 7, nous introduisons le métacontenu de pixel. Le métacontenu est du contenu portant sur du contenu. Ainsi, plutôt que d'être le contenu lui-même, c'est quelque chose qui décrit le contenu ou lui est associé. Ici, le contenu est un pixel. Le métacontenu de pixel est à votre usage exclusif (en interne, les données sont simplement copiées, elles ne sont pas modifiées) et est accédé via ces méthodes de l'API MagickCore :

SetImageMetacontentExtent()
GetImageMetacontentExtent()
GetVirtualMetacontent()
GetAuthenticMetacontent()
GetCacheViewAuthenticMetacontent()
GetCacheViewVirtualMetacontent()

Alpha

Nous prenons désormais en charge l'alpha, auparavant l'opacité. Avec l'alpha, une valeur de 0 signifie que le pixel ne possède aucune information de couverture et est transparent ; c'est-à-dire qu'il n'y a eu aucune contribution de couleur d'aucune géométrie, car la géométrie ne recouvrait pas ce pixel. Une valeur de QuantumRange signifie que le pixel est opaque, car la géométrie recouvrait complètement le pixel. Par conséquent, en version 7, le membre alpha de la structure PixelInfo a remplacé l'ancien membre opacity. Autre conséquence : la partie alpha d'une valeur sRGB en notation hexadécimale est désormais inversée (par exemple #0000 est entièrement transparent).

Espace colorimétrique

Les espaces colorimétriques Rec601Luma et Rec709Luma ne sont plus pris en charge. À la place, spécifiez l'espace colorimétrique gray et choisissez parmi ces options d'intensité :

Rec601Luma
Rec601Luminance
Rec709Luma
Rec709Luminance

Par exemple,

magick myImage.png -intensity Rec709Luminance -colorspace gray myImage.jpg

Niveaux de gris

Auparavant, les images en niveaux de gris étaient en Rec601Luminance et consommaient 4 canaux : rouge, vert, bleu et alpha. Avec la version 7, les niveaux de gris ne consomment qu'un seul canal, ce qui requiert par conséquent bien moins de ressources.

Masques

La version 7 prend en charge les masques pour la plupart des opérateurs d'image. Les pixels blancs dans un masque de lecture ignorent le pixel correspondant dans une image, tandis que les pixels blancs dans un masque d'écriture protègent le pixel correspondant dans l'image. Depuis la ligne de commande, vous pouvez associer un masque à une image avec les options -read-mask et -write-mask. Cette polarité correspond à celle des masques de la version 6 d'ImageMagick afin de faciliter le portage de votre flux de travail. Par commodité, nous continuons à prendre en charge l'option -mask en version 7 pour reproduire le comportement de la version 6.

Dans cet exemple, nous calculons la distorsion d'une image reconstruite masquée :

compare -metric rmse -read-mask hat_mask.png hat.png wizard.png difference.png

Ici, nous protégeons certains pixels de toute modification :

magick rose: -write-mask rose_bg_mask.png -modulate 110,100,33.3  +write-mask rose_blue.png

Un masque associé à une image persiste jusqu'à ce qu'il soit modifié ou supprimé. Cela peut produire des résultats inattendus pour des lignes de commande complexes. Ici, nous voulons effectuer le détourage uniquement lors de l'application de l'option alpha, pas du redimensionnement :

magick -density 300 -colorspace srgb image.eps -alpha transparent -clip -alpha opaque +clip -resize 1000x1000 -strip image.png

API MagickCore

Voici une liste des changements apportés à l'API MagickCore :

  • Presque tous les algorithmes de traitement d'images sont désormais conscients des canaux.
  • L'API MagickCore ajoute un argument ExceptionInfo aux méthodes qui en étaient dépourvues en version 6, par exemple NegateImage(image,MagickTrue,exception)
  • Tous les analogues par canal des méthodes ont été supprimés (par exemple BlurImageChannel()) ; ils ne sont plus nécessaires, utilisez plutôt les traits de pixel.
  • Les appels d'API publics et privés sont désormais déclarés avec l'attribut de visibilité de GCC. Les bibliothèques dynamiques MagickCore et MagickWand n'exportent désormais que les déclarations publiques de structures et de fonctions.
  • L'énumération InterpolatePixelMethod est désormais PixelInterpolateMethod.
  • Le type de stockage IntegerPixel est supprimé (utilisez LongPixel à la place) et LongLongPixel est ajouté
  • Les signatures d'image ont changé pour tenir compte des canaux de pixel variables.
  • Toutes les structures de paquet de couleur, PixelPacket, LongPacket et DoublePacket, sont consolidées en une structure de couleur unique, PixelInfo.
  • Le membre I de la structure ChannelMoments est désormais invariant. I entre en conflit avec l'en-tête complex.h.
  • Nous avons ajouté un paramètre length à FormatMagickSize() pour permettre des tampons de longueur variable.

API MagickWand

Voici une liste des changements apportés à l'API MagickWand :

  • Presque tous les algorithmes de traitement d'images sont désormais conscients des canaux.
  • La méthode DrawMatte() s'appelle désormais DrawAlpha().
  • Les méthodes MagickSetImageBias() et MagickSetImageClipMask() ne sont plus prises en charge.

API Magick++

Voici une liste des changements apportés à l'API Magick++ :

  • Presque tous les algorithmes de traitement d'images sont désormais conscients des canaux.
  • Utilisez cette construction, par exemple, pour éviter d'opérer sur le canal alpha :
    image.negateChannel(Magick::ChannelType(Magick::CompositeChannels ^ Magick::AlphaChannel));
    

Fichiers d'en-tête

Les versions antérieures d'ImageMagick (4-6) référencent les fichiers d'en-tête d'ImageMagick sous magick/ et wand/. ImageMagick 7 utilise à la place MagickCore/ et MagickWand/ respectivement. Par exemple,

#include <MagickCore/MagickCore.h>
#include <MagickWand/MagickWand.h>

Fonctionnalités obsolètes supprimées

Toutes les fonctionnalités obsolètes d'ImageMagick version 6 sont supprimées en version 7. Cela inclut les utilitaires de configuration Magick-config et Wand-config. Utilisez à la place :

MagickCore-config
MagickWand-config

La méthode FilterImage() a été supprimée. Utilisez ConvolveImage() à la place.

De plus, toutes les méthodes obsolètes de MagickCore et MagickWand ne sont plus disponibles en version 7.

Le filtre Bessel a été supprimé car il s'agit d'un alias de Jinc. Utilisez -filter Jinc à la place.

API shell ou interface en ligne de commande

Comme mentionné, l'objectif principal des changements apportés à l'API shell ou interface en ligne de commande est l'abstraction, de sorte que les options puissent être lues non seulement depuis les arguments de la ligne de commande, mais aussi depuis un fichier (script) ou depuis un flux de fichiers (commandes interactives ou co-traitement).

Pour ce faire, l'analyseur de la CLI a dû être réécrit, afin de toujours exécuter toutes les options dans un ordre strict « au fur et à mesure ». Auparavant, dans IMv6, les options étaient exécutées par groupes (connus sous le nom de « FireOptions ») ; cette maladresse a maintenant disparu. Toutefois, l'ordre strict signifie que vous ne pouvez plus indiquer d'opérations avant d'avoir fourni une image sur laquelle elles doivent agir. Le faire produira désormais une erreur.

Le signalement des erreurs indique désormais exactement quelle option (par numéro d'argument sur la ligne de commande, ou par ligne, colonne dans les scripts) a causé l'« exception ». Ce n'est pas encore complet, mais cela s'améliore. La gestion de « regard-warnings » ou son remplacement n'est pas non plus complète ; elle vous permettra d'ignorer les erreurs signalées et de poursuivre le traitement (selon ce qui convient en fonction de l'erreur) dans les co-traitements ou en usage interactif.

Avec l'analyseur d'IMv7, activé par l'utilitaire magick, les paramètres sont appliqués tour à tour à chaque image en mémoire (s'il y en a). En revanche, une option: n'a besoin d'être appliquée qu'une seule fois de façon globale. Utiliser directement les autres utilitaires, ou en argument de la CLI magick (par exemple magick), recourt à l'analyseur hérité.

Les options entre parenthèses qui servaient à « empiler » la liste d'images courante et les paramètres d'image (par exemple « ( » et « ) ») sur une pile possèdent désormais une pile de paramètres d'image entièrement distincte. C'est-à-dire que les parenthèses « empilent/dépilent » les listes d'images, et les accolades (par exemple « { » et « } ») « empilent/dépilent » les paramètres d'image.

Bien entendu, en raison des changements signalés précédemment dans la gestion sous-jacente des canaux, il en résultera de nombreux effets secondaires sur presque toutes les options. En voici quelques-uns en particulier.

La plupart des algorithmes mettent à jour les canaux rouge, vert, bleu, noir (pour le CMYK) et alpha. La plupart des opérateurs fondent l'alpha avec les autres canaux de couleur, mais d'autres opérateurs (et situations) peuvent exiger que ce mélange soit désactivé, ce qui se fait actuellement en retirant l'alpha des canaux actifs via l'option -channel (par exemple magick castle.gif -channel RGB -negate castle.png).

La lecture d'images en niveaux de gris génère une image ne comportant qu'un seul canal. Si cette image doit ensuite accepter de la couleur, le paramètre -colorspace doit être appliqué pour étendre l'unique canal en canaux RGB (ou autres) distincts.

Auparavant, les arguments de ligne de commande étaient limités à 4096 caractères ; avec ImageMagick version 7, la limite est passée à 131072 caractères.

Changements de commande

Voici une liste des changements apportés aux commandes d'ImageMagick :

magick
IMPORTANT : la commande « magick » est la nouvelle commande principale de l'API shell, remplaçant l'ancienne commande « convert ». Cela vous permet de créer un « script magick » de la forme « #!/path/to/command/magick -script », ou de canaliser des options dans une commande « magick -script - », en tant que processus d'arrière-plan.
magick-script
Identique à « magick » (seul le nom de la commande diffère), mais comporte une option « -script » implicite. Cela vous permet de l'utiliser sous une forme de script de style « env ». C'est-à-dire qu'un script magick commence par la ligne « shebang » « #!/usr/bin/env magick-script », permettant de trouver l'interpréteur de script n'importe où dans le « PATH » de commande de l'utilisateur. Cela est nécessaire pour contourner un « bogue du shebang à argument unique » courant sur la plupart des systèmes UNIX (y compris Linux, mais pas MacOSX).
animate, compare, composite, conjure, convert, display, identify, import, mogrify, montage, stream
Pour réduire l'empreinte des utilitaires en ligne de commande, ces utilitaires sont des liens symboliques vers l'utilitaire magick. Sous Windows, ces utilitaires sont installés en tant qu'exécutables distincts et l'exécutable hérité convert n'est plus inclus. Vous pouvez aussi les invoquer depuis l'utilitaire magick, par exemple, utilisez magick logo: logo.png pour invoquer l'utilitaire magick. (En d'autres termes, appelez ces utilitaires en les préfixant par magick, par exemple magick compare, magick identify, magick mogrify, magick montage, etc. N'utilisez pas magick convert. C'est simplement magick)

Changements de comportement

Les paramètres d'image sont appliqués à chaque image sur la ligne de commande. Pour associer un paramètre à une image particulière, utilisez des parenthèses afin de lever toute ambiguïté. Dans cet exemple, nous attribuons un décalage de page unique à chaque image :

magick \( -page +10+20 first.png \) \( -page +100+200 second.png \) ...

Par défaut, les opérations d'image telles que la convolution fondent l'alpha avec chaque canal. Pour effectuer la convolution de chaque canal indépendamment, désactivez le canal alpha comme suit :

magick ... -alpha discrete -blur 0x1 ...

Pour retirer les valeurs alpha de votre image, utilisez -alpha off. Si vous souhaitez plutôt conserver le canal alpha sans fondre les pixels alpha pour certaines opérations de traitement d'image, utilisez -alpha deactivate à la place.

Certaines options ont changé dans ImageMagick version 7. Elles incluent :

-channel
le comportement par défaut consiste à mettre à jour les canaux RGBA ; auparavant, dans IMv6, le comportement par défaut était RGB. Si vous obtenez des résultats qui diffèrent d'IMv6, vous devrez peut-être spécifier -channel RGB sur votre ligne de commande (par exemple -channel RGB -negate).
+combine
Cette option requiert désormais un argument, l'espace colorimétrique de l'image (par exemple +combine sRGB).
-format
La propriété d'image %Z n'est plus prise en charge.
-gamma
Les arguments gamma multiples (par exemple -gamma 1,2,3) ne sont plus pris en charge ; utilisez plutôt -channel (par exemple -channel blue -gamma 2).
-region
Cette option définit un masque d'écriture pour la région que vous délimitez. Dans IMv6, une image distincte était clonée à la place, traitée, puis les résultats étaient composités sur l'image source. De plus, les transformations de dessin sont relatives au coin supérieur gauche de l'image ; auparavant, dans IMv6, elles étaient relatives à la région.

Utilisez -define morphology:showKernel=1 pour afficher le noyau de morphologie ou de convolution. Auparavant, c'était -define showKernel=1.

Nouvelles options

ImageMagick version 7 prend en charge ces nouvelles options, bien que la plupart soient limitées à la commande « magick » ou à un usage dans des scripts « magick ».

{ ... }
Enregistre (et restaure) les paramètres d'image courants (connus en interne sous le nom de structure « image_info »). Cela se fait automatiquement avec les parenthèses (par exemple « ( » et « ) ») si « -regard-parenthesis » a été défini, tout comme dans IMv6. La prudence est de mise pour éviter les erreurs d'accolades déséquilibrées.
--
Fin des options ; à utiliser dans la commande « mogrify » d'IMv7 pour séparer explicitement les opérations à appliquer des images devant être traitées « sur place ». (pas encore implémenté). Toutefois, si elle n'est pas fournie, « -read » peut tout de même être utilisée pour distinguer les lectures d'images secondaires (à utiliser dans des choses telles que la composition alpha) de l'image traitée « sur place ». Dans d'autres commandes (telles que « magick »), elle équivaut à un « -read » explicite (voir ci-dessous) de l'option suivante en tant qu'image (comme c'était le cas dans IMv6).
-alpha activate/deactivate
active et désactive le canal alpha, respectivement, avec persistance. C'est comme on/off dans Imagemagick 6. Dans Imagemagick 7, -alpha off retirera le canal alpha de façon permanente, de sorte que -alpha on ne le réactivera pas.
-alpha discrete
traite le canal alpha indépendamment (ne pas fondre).

-channel-fx expression

échange, extrait ou copie un ou plusieurs canaux d'image.

L'expression se compose d'un ou plusieurs canaux, soit mnémoniques, soit numériques (par exemple red ou 0, green ou 1, etc.), séparés par certains symboles d'opération comme suit :

<=>  échange deux canaux (par exemple red<=>blue)
=>   copie un canal vers un autre canal (par exemple red=>green)
=    affecte une valeur constante à un canal (par exemple red=50%)
,    écrit une nouvelle image avec les canaux dans l'ordre spécifié (par exemple red, green)
;    ajoute une nouvelle image de sortie pour l'ensemble suivant d'opérations de canal (par exemple red; green; blue)
|    passe à l'image d'entrée suivante comme source des données de canal (par exemple | gray=>alpha)

Par exemple, pour créer 3 images en niveaux de gris à partir des canaux rouge, vert et bleu d'une image, utilisez :

-channel-fx "red; green; blue"

Un canal sans symbole d'opération implique separate (c'est-à-dire un point-virgule).

Ici, nous prenons une image sRGB et une image en niveaux de gris, et nous injectons l'image en niveaux de gris dans le canal alpha :

magick wizard.png mask.pgm -channel-fx '| gray=>alpha' wizard-alpha.png

Utilisez une commande similaire pour définir un masque de lecture :

magick wizard.png mask.pgm -channel-fx '| gray=>read-mask' wizard-mask.png

Ajoutez -debug pixel avant l'option -channel-fx pour suivre la morphologie des canaux.

-exit
Arrête le traitement à ce point. Aucune autre option ne sera traitée après cette option. Peut être utilisée dans un script pour forcer la commande « magick » à se terminer, sans réellement fermer le pipeline depuis lequel elle traite les options. Peut aussi être utilisée comme option « finale » sur la ligne de commande « magick », au lieu d'une image de sortie implicite, pour empêcher complètement toute écriture d'image. APARTÉ : même le codeur « NULL: » requiert au moins une image pour « ne pas écrire » ! Cette option ne requiert aucune image du tout.
-read
Lecture explicite d'une image, plutôt qu'une lecture implicite. Cela vous permet de lire des noms de fichiers commençant par un caractère « option » et qui pourraient autrement être pris pour une option (connue ou non). Cela sera à terme utilisé dans « mogrify » pour permettre la lecture d'images secondaires, et autoriser l'usage des opérations de liste d'images au sein de cette commande.
-read-mask
empêche les mises à jour des pixels d'image spécifiés par le masque
-region
pris en charge dans ImageMagick 7.0.2-6 et au-delà
-script
Dans « magick », arrête le traitement des arguments de la ligne de commande en tant qu'opérations d'image, et lit toutes les options suivantes depuis le fichier ou le pipeline indiqué.
-write-mask
empêche les pixels d'être écrits.

Options modifiées

Ces options sont connues pour avoir changé, d'une manière ou d'une autre.

-bias
L'option n'est plus reconnue. Utilisez -define convolve:bias=value à la place.
-draw
La primitive matte est désormais alpha (par exemple -draw 'alpha 0,0 floodfill').
-negate
inverse actuellement tous les canaux, y compris l'alpha s'il est présent. Par conséquent, vous devrez peut-être utiliser l'option -channel pour empêcher l'inversion de l'alpha (par exemple -channel RGB -negate).
-preview
cette option est désormais un opérateur d'image. Le format d'image PREVIEW a été supprimé.

Avertissement d'obsolescence émis, mais fonctionne (pour l'instant)

-affine
Remplacée par -draw "affine ...". (voir transform)
-average
Remplacée par -evaluate-sequence Mean.
-box
Remplacée par -undercolor.
-deconstruct
Remplacée par -layers CompareAny.
-gaussian
Remplacée par -gaussian-blur.
-/+map
Remplacée par -/+remap.
-/+mask
Remplacée par -/+read-mask, -/+write-mask.
-/+matte
Remplacée par -alpha Set/Off.
-transform
Remplacée par -distort Affine "...".

Avertissement d'obsolescence émis, et ignoré (pour l'instant)

Presque toutes les options « plus » (+) qui ne faisaient rien ont été marquées comme obsolètes et ne font rien. Elles n'ont même pas de code associé. Par exemple « +annotate », « +resize », « +clut » et « +draw ».

-affinity
Remplacée par -remap.
-maximum
Remplacée par -evaluate-sequence Max.
-median
Remplacée par -evaluate-sequence Median.
-minimum
Remplacée par -evaluate-sequence Min.
-recolor
Remplacée par -color-matrix.

Options supprimées / remplacées (erreur « no such option » et abandon)

-interpolate filter
suppression d'une méthode d'interpolation lente et inutile
-origin
ancienne option, signification inconnue.
-pen
Remplacée par -fill.
-passphrase
ancienne option, signification inconnue

Améliorations de performance

Le traitement des images en niveaux de gris est nettement amélioré, car un seul canal est requis. Auparavant, les niveaux de gris nécessitaient trois canaux.

La performance de l'option -fx a augmenté d'un à deux ordres de grandeur.

Résumé des changements de la version 7

Les changements d'ImageMagick version 6 à la version 7 sont résumés ici :

Imagerie à haute gamme dynamique

  • ImageMagick version 7 active le HDRI par défaut. Attendez-vous à des résultats de traitement d'images plus précis, avec des besoins en mémoire plus élevés et des temps de traitement éventuellement plus longs. Vous pouvez désactiver cette fonctionnalité pour les systèmes à ressources limitées tels qu'un téléphone portable, avec une légère perte de précision pour certains algorithmes (par exemple le redimensionnement).

Pixels

  • Les pixels ne sont plus adressés via les membres de la structure PixelPacket (par exemple red, green, blue, opacity), mais sous forme de tableau de canaux (par exemple pixel[PixelRedChannel]).
  • Utilisez les macros pratiques pour accéder aux canaux de pixel (par exemple GetPixelRed(), SetPixelRed()).
  • Le canal noir de l'espace colorimétrique CMYK n'est plus stocké dans le canal d'index, auparavant accédé avec GetAuthenticIndexQueue() et GetCacheViewAuthenticIndexQueue(). Il s'agit désormais d'un canal de pixel, accédé avec les macros de pixel pratiques GetPixelBlack() et SetPixelBlack().
  • Le canal d'index des images à palette n'est plus stocké dans le canal d'index, auparavant accédé avec GetAuthenticIndexQueue() et GetCacheViewAuthenticIndexQueue(). Il s'agit désormais d'un canal de pixel, accédé avec les macros de pixel pratiques GetPixelIndex() et SetPixelIndex().
  • Utilisez GetPixelChannels() pour avancer jusqu'à l'ensemble suivant de canaux de pixel.
  • Utilisez le canal de métacontenu pour associer du métacontenu à chaque pixel.
  • Toutes les structures de paquet de couleur, PixelPacket, LongPacket et DoublePacket, sont consolidées en une structure de couleur unique, PixelInfo.

Alpha

  • Nous prenons en charge l'alpha plutôt que l'opacité (0 transparent ; QuantumRange opaque).
  • Utilisez GetPixelAlpha() ou SetPixelAlpha() pour lire ou définir la valeur du canal de pixel alpha.

Niveaux de gris

  • Les images en niveaux de gris consomment un canal de pixel dans ImageMagick version 7. Pour traiter le RGB, définissez l'espace colorimétrique sur RGB (par exemple -colorspace sRGB).

Masques

  • ImageMagick version 6 ne prend en charge le masque de lecture que dans des circonstances limitées. La version 7 prend en charge à la fois un masque de lecture et un masque d'écriture. Le masque de lecture est respecté par la plupart des algorithmes de traitement d'image.

API MagickCore

  • Presque tous les algorithmes de traitement d'images sont désormais conscients des canaux.
  • MagickCore, version 7, ajoute un argument ExceptionInfo aux méthodes qui en étaient dépourvues en version 6, par exemple NegateImage(image,MagickTrue,exception);
  • Tous les analogues par canal des méthodes ont été supprimés (par exemple BlurImageChannel()) ; ils ne sont plus nécessaires, utilisez plutôt les traits de pixel.
  • Les appels d'API publics et privés sont désormais déclarés avec l'attribut de visibilité de GCC. Les bibliothèques dynamiques MagickCore et MagickWand n'exportent désormais que les déclarations publiques de structures et de fonctions.
  • L'énumération InterpolatePixelMethod est désormais PixelInterpolateMethod.
  • Pour tenir compte des canaux de pixel variables, les images peuvent désormais renvoyer une signature différente.

Méthodes obsolètes

  • Toutes les méthodes obsolètes MagickCore et MagickWand d'ImageMagick version 6 sont supprimées et ne sont plus disponibles dans ImageMagick version 7.
  • Tous les analogues par canal des méthodes MagickCore sont supprimés (par exemple NegateImageChannels()). Pour la version 7, utilisez plutôt les traits de pixel.
  • La méthode FilterImage() a été supprimée. Utilisez ConvolveImage() à la place.