cClaude.rocks ☕ Le blog

[Nouvelles technologies du libre, 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 - 2024 | 🏠 Accueil du domaine | 🏡 Accueil du blog