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