cClaude.rocks ☕ Le blog

[Nouvelles technologies, sciences et coups de gueule…]

Menu

ImageMagick est une suite de logiciel libre permettant la manipulation des images.

Plus précisément, c’est une bibliothèque, ainsi qu’un ensemble d’utilitaires en ligne de commande, permettant de créer, de convertir, de modifier et d’afficher des images dans un très grand nombre de formats.

Les images peuvent être découpées, les couleurs peuvent être modifiées, différents effets peuvent être appliqués aux images, les images peuvent subir des rotations, il est possible d’y inclure du texte, des segments, des polygones, des ellipses et des courbes de Bézier, etc.



  • Si ImageMagick est un logiciel libre avec une licence compatible avec la licence GNU GPL, c’est une marque étasunienne déposée.
  • ImageMagick est disponible sur la plupart des plates-formes. ImageMagick est une marque déposée.

La plupart des fonctionnalités d'ImageMagick peuvent être utilisées en ligne de commande, mais ImageMagick est intégré à de nombreux programmes écrits dans des langages comme Perl, C, C++, Python, Ruby, PHP, OCaml ou Java, pour lesquels des interfaces prêtes à l’emploi (PerlMagick, Magick++, PythonMagick, RMagick, MagickWand pour PHP et JMagick) sont disponibles. Cela permet de manipuler des images de façon plus automatisée.

ImageMagick utilise les nombres magiques pour identifier les différents formats d’images qu’il manipule, d’où son nom.

Le but de ce billet n’est pas d’explorer l’ensemble des fonctionnalités d’ImageMagick mais simplement de savoir si une image est correctement encodée. Autre savoir si un fichier image est corrompu ou non sans avoir à l’afficher.



Utilisation basique de « identify »

La commande identify (ou identify-im6) permet d’obtenir le format et les caractéristiques d’une image.

identify -regard-warnings -verbose FICHIER

Pour détecter les erreurs, il n’y a guère que le code de retour qui peut servir :

identify image.png ; echo $?

Vous noterez deux commandes sur cette ligne, la seconde echo $? ayant pour but de rendre visible le code de retour (d’erreur) de la commande identify.

image.png PNG 256x256 256x256+0+0 8-bit sRGB 52685B 0.000u 0:00.000
0


Exemple avec « identify »

identify -regard-warnings -verbose ~/chemin/vers/image.png ; echo $?
  • Résultat
    Image:
      Filename: /home/user/chemin/vers/image.png
      Format: PNG (Portable Network Graphics)
      Mime type: image/png
      Class: DirectClass
      Geometry: 256x256+0+0
      Resolution: 28.35x28.35
      Print size: 9.02998x9.02998
      Units: PixelsPerCentimeter
      Colorspace: sRGB
      Type: TrueColorAlpha
      Base type: Undefined
      Endianness: Undefined
      Depth: 8-bit
      Channel depth:
        red: 8-bit
        green: 8-bit
        blue: 8-bit
        alpha: 8-bit
      Channel statistics:
        Pixels: 65536
        Red:
          min: 0  (0)
          max: 255 (1)
          mean: 41.9456 (0.164493)
          standard deviation: 79.6508 (0.312356)
          kurtosis: 1.008
          skewness: 1.62184
          entropy: 0.358438
        Green:
          min: 0  (0)
          max: 248 (0.972549)
          mean: 27.2758 (0.106964)
          standard deviation: 58.9612 (0.23122)
          kurtosis: 3.32737
          skewness: 2.18052
          entropy: 0.368442
        Blue:
          min: 0  (0)
          max: 255 (1)
          mean: 26.1751 (0.102648)
          standard deviation: 56.735 (0.22249)
          kurtosis: 4.97799
          skewness: 2.41857
          entropy: 0.364484
        Alpha:
          min: 0  (0)
          max: 255 (1)
          mean: 93.7249 (0.367549)
          standard deviation: 120.803 (0.473739)
          kurtosis: -1.66969
          skewness: 0.548967
          entropy: 0.204246
      Image statistics:
        Overall:
          min: 0  (0)
          max: 255 (1)
          mean: 47.2804 (0.185413)
          standard deviation: 79.0376 (0.309951)
          kurtosis: 0.849687
          skewness: 1.59341
          entropy: 0.323902
      Alpha: none   #00000000
      Rendering intent: Perceptual
      Gamma: 0.454545
      Chromaticity:
        red primary: (0.64,0.33)
        green primary: (0.3,0.6)
        blue primary: (0.15,0.06)
        white point: (0.3127,0.329)
      Background color: black
      Border color: srgba(223,223,223,1)
      Matte color: grey74
      Transparent color: none
      Interlace: None
      Intensity: Undefined
      Compose: Over
      Page geometry: 256x256+0+0
      Dispose: Undefined
      Iterations: 0
      Compression: Zip
      Orientation: Undefined
      Properties:
        Comment: Created with GIMP
        date:create: 2023-03-28T14:46:05+00:00
        date:modify: 2023-01-15T14:20:29+00:00
        png:bKGD: chunk was found (see Background color, above)
        png:IHDR.bit-depth-orig: 8
        png:IHDR.bit_depth: 8
        png:IHDR.color-type-orig: 6
        png:IHDR.color_type: 6 (RGBA)
        png:IHDR.interlace_method: 0 (Not interlaced)
        png:IHDR.width,height: 256, 256
        png:pHYs: x_res=2835, y_res=2835, units=1
        png:sRGB: intent=0 (Perceptual Intent)
        png:text: 1 tEXt/zTXt/iTXt chunks were found
        png:tIME: 2023-01-15T14:20:29Z
        signature: 0fff0000ffff0ff0f000f0000ffffffffff00000900000000f0f0f000fff00ff
      Artifacts:
        filename: /home/user/chemin/vers/image.png
        verbose: true
      Tainted: False
      Filesize: 52685B
      Number pixels: 65536
      Pixels per second: 34.7699MB
      User time: 0.000u
      Elapsed time: 0:01.001
      Version: ImageMagick 6.9.11-60 Q16 x86_64 2021-01-25 https://imagemagick.org
    0
    

Cas d’un fichier qui n’est pas une image :

identify noimage ; echo $?
identify-im6.q16: no decode delegate for this image format `' @ error/constitute.c/ReadImage/575.
1


Utilisation de « convert »

La commande convert (ou convert-im6) à une spécificité non documentée permettant de « convertir » vers du JSON, qui a pour effet de produire un flux JSON contenant les données techniques de l’image.

L’astuce consiste à envoyer le résultat par défaut vers le « fichier » json:, le fichier ne sera pas créé, mais un flux JSON se produit sur la sortie standard.

convert ~/chemin/vers/image.png json:
  • Exemple de sortie JSON
    [
      {
        "version": "1.0",
        "image": {
          "name": "/home/user/chemin/vers/image.png",
          "format": "PNG",
          "formatDescription": "Portable Network Graphics",
          "mimeType": "image/png",
          "class": "DirectClass",
          "geometry": {
            "width": 256,
            "height": 256,
            "x": 0,
            "y": 0
          },
          "resolution": {
            "x": 28.35,
            "y": 28.35
          },
          "printSize": {
            "x": 9.02998,
            "y": 9.02998
          },
          "units": "PixelsPerCentimeter",
          "type": "TrueColorAlpha",
          "endianness": "Undefined",
          "colorspace": "sRGB",
          "depth": 8,
          "baseDepth": 8,
          "channelDepth": {
            "alpha": 8,
            "red": 8,
            "green": 8,
            "blue": 8
          },
          "pixels": 65536,
          "imageStatistics": {
            "all": {
              "min": 0,
              "max": 255,
              "mean": 47.2804,
              "standardDeviation": 79.0376,
              "kurtosis": 0.849687,
              "skewness": 1.59341,
              "entropy": 0.323902
            }
          },
          "channelStatistics": {
            "alpha": {
              "min": 255,
              "max": 0,
              "mean": 161.275,
              "standardDeviation": 120.803,
              "kurtosis": -1.66969,
              "skewness": 0.548967,
              "entropy": 0.204246
            },
            "red": {
              "min": 0,
              "max": 255,
              "mean": 41.9456,
              "standardDeviation": 79.6508,
              "kurtosis": 1.008,
              "skewness": 1.62184,
              "entropy": 0.358438
            },
            "green": {
              "min": 0,
              "max": 248,
              "mean": 27.2758,
              "standardDeviation": 58.9612,
              "kurtosis": 3.32737,
              "skewness": 2.18052,
              "entropy": 0.368442
            },
            "blue": {
              "min": 0,
              "max": 255,
              "mean": 26.1751,
              "standardDeviation": 56.735,
              "kurtosis": 4.97799,
              "skewness": 2.41857,
              "entropy": 0.364484
            }
          },
          "alpha": "#00000000",
          "renderingIntent": "Perceptual",
          "gamma": 0.454545,
          "chromaticity": {
            "redPrimary": {
              "x": 0.64,
              "y": 0.33
            },
            "greenPrimary": {
              "x": 0.3,
              "y": 0.6
            },
            "bluePrimary": {
              "x": 0.15,
              "y": 0.06
            },
            "whitePrimary": {
              "x": 0.3127,
              "y": 0.329
            }
          },
          "backgroundColor": "#000000FF",
          "borderColor": "#DFDFDFFF",
          "matteColor": "#BDBDBDFF",
          "transparentColor": "#00000000",
          "interlace": "None",
          "intensity": "Undefined",
          "compose": "Over",
          "pageGeometry": {
            "width": 256,
            "height": 256,
            "x": 0,
            "y": 0
          },
          "dispose": "Undefined",
          "iterations": 0,
          "compression": "Zip",
          "orientation": "Undefined",
          "properties": {
            "Comment": "Created with GIMP",
            "date:create": "2023-03-28T14:46:05+00:00",
            "date:modify": "2023-01-15T14:20:29+00:00",
            "png:bKGD": "chunk was found (see Background color, above)",
            "png:IHDR.bit-depth-orig": "8",
            "png:IHDR.bit_depth": "8",
            "png:IHDR.color-type-orig": "6",
            "png:IHDR.color_type": "6 (RGBA)",
            "png:IHDR.interlace_method": "0 (Not interlaced)",
            "png:IHDR.width,height": "256, 256",
            "png:pHYs": "x_res=2835, y_res=2835, units=1",
            "png:sRGB": "intent=0 (Perceptual Intent)",
            "png:text": "1 tEXt/zTXt/iTXt chunks were found",
            "png:tIME": "2023-01-15T14:20:29Z",
            "signature": "0fff0000ffff0ff0f000f0000ffffffffff00000900000000f0f0f000fff00ff"
          },
          "artifacts": {
            "filename": "/home/user/chemin/vers/image.png"
          },
          "tainted": false,
          "filesize": "52685B",
          "numberPixels": "65536",
          "pixelsPerSecond": "26.6336MB",
          "userTime": "0.000u",
          "elapsedTime": "0:01.002",
          "version": "ImageMagick 6.9.11-60 Q16 x86_64 2021-01-25 https://imagemagick.org"
        }
      }
    ]
    


Utilisation de « convert » dans un script bash

Parce qu’en cas d’erreur convert (ou convert-im6) ne produit pas de sortie JSON, si vous souhaitez embarque l’utilisation de cette commande dans un script je vous suggère d’envelopper afin de produire du code JSON en cas d’erreur.

function __convert_json__ {
  local -r file="$1"

  local res2_file=
  res2_file="$( mktemp --suffix .err )" || return $?

  local -i rc=0
  local res=
  res="$( convert "${file}" json: 2>"${res2_file}" )" || rc=$?
  if [ -z "${res}" ] ; then
    jq --raw-input --null-input -c \
       --argjson rc "${rc}" \
       --arg file "${file}" \
       '{ file: $file, error: { code: $rc, messages: [ inputs ] }}' "${res2_file}" || return $?
  else
    jq -c \
       --argjson rc "${rc}" \
       --arg file "${file}" \
       '.[] | . + {file: $file, error: { code: $rc } }' <<<"${res}" || return $?
  fi
  rm "${res2_file}" >&2
}

function convert_json {
  local -r file="$1"

  local res=
  res="$( __convert_json__ "${file}" )" || return $?
  jq --sort-keys '.' <<<"${res}"
}


Liens

  • Le site officiel d'ImageMagick
  • La licence d'ImageMagick à intégrer à votre code si vous utilisez ImageMagick dans vos créations.

ᦿ


ℹ 2006 - 2023 | 🏠 Accueil du domaine | 🏡 Accueil du blog