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.
ᦿ