{"id":2890,"date":"2008-12-10T02:55:39","date_gmt":"2008-12-10T01:55:39","guid":{"rendered":"http:\/\/www.hyperbate.com\/dernier\/?p=2890"},"modified":"2008-12-10T02:55:39","modified_gmt":"2008-12-10T01:55:39","slug":"processing-quatorzieme-cours","status":"publish","type":"post","link":"https:\/\/hyperbate.fr\/dernier\/?p=2890","title":{"rendered":"Processing, quatorzi\u00e8me cours"},"content":{"rendered":"<p>Apr\u00e8s les variables, les boucles et les objets, d\u00e9compressons un peu avec les images.<br \/>\nProcessing est capable de charger un fichier graphique en m\u00e9moire et de le manipuler de diverses fa\u00e7ons notamment en l&rsquo;affichant, en obtenant la valeur color\u00e9e d&rsquo;un point pr\u00e9cis ou en dessinant sur cette image. Les principes sont simples mais il y a une \u00e9tape \u00e0 ne pas n\u00e9gliger, celle du chargement du fichier graphique dans le dossier de donn\u00e9es externes de l&rsquo;animation. Lorsque l&rsquo;on enregistre une animation, celle-ci se place dans un dossier qui porte le m\u00eame nom. Dans ce dossier se trouve parfois un sous-dossier nomm\u00e9 \u00ab\u00a0data\u00a0\u00bb o\u00f9 seront stock\u00e9es toutes les ressources que l&rsquo;utilisateur souhaite utiliser : images, sons, mais aussi typographies \u00ab\u00a0rast\u00e9ris\u00e9es\u00a0\u00bb (sujet qui ne nous occupera pas tout de suite). Deux m\u00e9thodes permettent de manipuler un fichier graphique.<br \/>\nSoit on cr\u00e9e le sous-dossier \u00ab\u00a0data\u00a0\u00bb pour y placer le fichier en question, soit, plus facile, en passant par la commande Sketch&gt;Add File. Lorsque l&rsquo;on s\u00e9lectionne un fichier avec cette seconde m\u00e9thode, Processing cr\u00e9e une copie du fichier \u00e0 ajouter et place celle-ci dans le dossier \u00ab\u00a0data\u00a0\u00bb de l&rsquo;animation, dossier que le programme cr\u00e9e s&rsquo;il n&rsquo;existe pas.<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-medium wp-image-2893\" src=\"\/dernier\/files\/2008\/12\/add_file.png\" alt=\"\" width=\"530\" height=\"200\" srcset=\"https:\/\/hyperbate.fr\/dernier\/files\/2008\/12\/add_file.png 530w, https:\/\/hyperbate.fr\/dernier\/files\/2008\/12\/add_file-300x113.png 300w\" sizes=\"(max-width: 530px) 100vw, 530px\" \/><\/p>\n<p>Pour que tout se d\u00e9roule bien, il faut respecter quelques r\u00e8gles tr\u00e8s simples.<\/p>\n<ul>\n<li>Avant d&rsquo;ajouter un fichier \u00e0 l&rsquo;animation, il faut avoir pris soin d&rsquo;enregistrer cette animation. Si on ne le fait pas, le programme range l&rsquo;image dans un dossier temporaire.<\/li>\n<li>Si la m\u00eame image est utilis\u00e9e par un autre programme, il faut avoir enregistr\u00e9 une copie de l&rsquo;image dans le dossier de ressources de chaque animation.<\/li>\n<li>L&rsquo;image doit \u00eatre dans un format lisible par Processing. Il y en a quatre pour l&rsquo;instant, \u00e0 savoir les formats <strong>gif<\/strong>, <strong>jpeg<\/strong>, <strong>tga <\/strong>et <strong>png<\/strong>. Ces images peuvent \u00eatre, selon les formats, en RGB, en couleurs index\u00e9es ou en RGB avec couche Alpha.<\/li>\n<li>Le chargement de l&rsquo;image se fait de pr\u00e9f\u00e9rence au d\u00e9but de l&rsquo;animation, dans la fonction setup().<\/li>\n<\/ul>\n<p>Lorsque l&rsquo;on manipule une image en m\u00e9moire, Processing la stocke sous la forme d&rsquo;une variable de type <strong>PImage<\/strong>. (qui signifie <em>Processing Image<\/em>). Voici un exemple typique de d\u00e9claration et de chargement d&rsquo;une image :<\/p>\n<div class=\"code\">\n<pre>PImage monImage = loadImage(\"paysage.png\");<\/pre>\n<\/div>\n<p>La premi\u00e8re partie,\u00a0<code>PImage monImage<\/code> sert \u00e0 d\u00e9clarer une donn\u00e9e <code>PImage<\/code> nomm\u00e9e <code>monImage<\/code>. Dans le m\u00eame mouvement, on remplit cette variable <code>monImage<\/code> avec la commande <code>loadImage()<\/code>. En \u00e9crivant <code>loadImage(<\/code><em>un nom de fichier<\/em><code>)<\/code>, on demande \u00e0 Processing de se rendre dans le sous-dossier \u00ab\u00a0data\u00a0\u00bb pour y chercher le fichier en question et pour le charger en m\u00e9moire. Nous pouvons ensuite utiliser cette image \u00e0 notre guise et acc\u00e9der \u00e0 ses propri\u00e9t\u00e9s<sup><a href=\"#footnote_1_2890\" id=\"identifier_1_2890\" class=\"footnote-link footnote-identifier-link\" title=\"Si l&rsquo;on veut emp&ecirc;cher le programme de s&rsquo;ex&eacute;cuter tant que l&rsquo;image n&rsquo;est pas charg&eacute;e (ce qui est pratique sur Internet par exemple), on peut remplacer loadImage() par&nbsp;requestImage().&nbsp;\">1<\/a><\/sup> . Par exemple en \u00e9crivant <code>print(monImage.width);<\/code>, nous obtiendrons la largeur de l&rsquo;image (sous r\u00e9serve que celle-ci ait effectivement \u00e9t\u00e9 charg\u00e9e). Le fait de conna\u00eetre la largeur et la hauteur d&rsquo;une image peut nous permettre, par exemple, de caler la taille de la fen\u00eatre de notre application sur le format de l&rsquo;image, comme ceci : <code>size(monImage.width, monImage.height);<\/code>.<\/p>\n<p>Faisons un premier essai de chargement et d&rsquo;affichage d&rsquo;une image. Mon image se nomme \u00ab\u00a0image_quend.jpg\u00a0\u00bb (pour l&rsquo;anecdote, il s&rsquo;agit d&rsquo;une photographie de Quend-Plage en Baie-de-Somme). Je vais tout d&rsquo;abord charger l&rsquo;image en m\u00e9moire, r\u00e9gler la taille de la fen\u00eatre d&rsquo;affichage sur la taille de l&rsquo;image, puis afficher cette image, ce qui me donnera pr\u00e9cis\u00e9ment ce r\u00e9sultat :<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-medium wp-image-2901\" src=\"\/dernier\/files\/2008\/12\/quend1.jpg\" alt=\"\" width=\"530\" height=\"213\" srcset=\"https:\/\/hyperbate.fr\/dernier\/files\/2008\/12\/quend1.jpg 530w, https:\/\/hyperbate.fr\/dernier\/files\/2008\/12\/quend1-300x120.jpg 300w\" sizes=\"(max-width: 530px) 100vw, 530px\" \/><\/p>\n<div class=\"code\">\n<pre><span class=\"rem\">\/\/ d\u00e9claration de l'image nomm\u00e9e img<\/span>\nPImage img;\n\nvoid setup(){\n <span class=\"rem\">\/\/ chargement du fichier externe image_quend.jpg dans img<\/span>\n\u00a0\u00a0img = loadImage(\"image_quend.jpg\");\n<span class=\"rem\">\/\/ r\u00e9glage de la taille de la fen\u00eatre sur les dimensions de img<\/span>\n\u00a0\u00a0size(img.width, img.height);\n<span class=\"rem\">\/\/ affichage de l'image img \u00e0 partir du point (0,0).<\/span>\n\u00a0\u00a0image(img,0,0);\n}<\/pre>\n<\/div>\n<p>La derni\u00e8re commande, image(), sert \u00e0 afficher une image \u00e0 un endroit pr\u00e9cis de la sc\u00e8ne selon cette syntaxe : <code><strong>image( nom_de_l'image, x, y);<\/strong><\/code> ou\u00a0<code><strong>image( nom_de_l'image, x, y, largeur, hauteur);<\/strong><\/code>, o\u00f9\u00a0<code>nom_de_l'image<\/code> est le nom de la variable de type <code>PImage<\/code> dans laquelle a \u00e9t\u00e9 charg\u00e9e l&rsquo;image ; <code>x<\/code> est l&rsquo;abscisse du point sup\u00e9rieur gauche de l&rsquo;image ; <code>y<\/code> est son ordonn\u00e9e ; les valeurs facultatives <code>largeur<\/code> et <code>hauteur<\/code> permettent de r\u00e9gler la largeur et la hauteur \u00e0 laquelle l&rsquo;image est reproduite. Dans la variante qui suit, l&rsquo;image est copi\u00e9e quatre fois sur la sc\u00e8ne \u00e0 la moiti\u00e9 de sa largeur (<code>img.width\/2<\/code>)\u00a0et de sa hauteur (<code>img.height\/2<\/code>) et \u00e0 quatre coordonn\u00e9es diff\u00e9rentes : (0,0), (la moiti\u00e9 de la largeur, 0), (la moiti\u00e9 de la largeur, la moiti\u00e9 de la hauteur), (0, la poiti\u00e9 de la hauteur).<\/p>\n<div class=\"code\">\n<pre>PImage img;\nvoid setup(){\n  img = loadImage(\"image_quend.jpg\");\n  size(img.width, img.height);\n  image(img,0,0,img.width\/2,img.height\/2);\n  image(img,img.width\/2,0,img.width\/2,img.height\/2);\n  image(img,0,img.height\/2,img.width\/2,img.height\/2);\n  image(img,img.width\/2,img.height\/2,img.width\/2,img.height\/2);\n}<\/pre>\n<\/div>\n<p>Et voici le r\u00e9sultat :<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-medium wp-image-2907\" src=\"\/dernier\/files\/2008\/12\/quend2.jpg\" alt=\"\" width=\"530\" height=\"213\" srcset=\"https:\/\/hyperbate.fr\/dernier\/files\/2008\/12\/quend2.jpg 530w, https:\/\/hyperbate.fr\/dernier\/files\/2008\/12\/quend2-300x120.jpg 300w\" sizes=\"(max-width: 530px) 100vw, 530px\" \/><\/p>\n<p>Ici le rapport entre hauteur et hauteur reste homoth\u00e9tique, mais il peut ne pas l&rsquo;\u00eatre.<\/p>\n<p><img decoding=\"async\" class=\"imageadroite\" src=\"\/dernier\/files\/2008\/12\/quend3.jpg\" alt=\"\" width=\"134\" height=\"152\" align=\"right\" \/>Dans l&rsquo;exemple qui suit, la fen\u00eatre fait 100&#215;100 pixels et l&rsquo;image est d\u00e9form\u00e9e pour avoir une largeur de 100 pixels et une hauteur de 100 pixels :<\/p>\n<div class=\"code\">\n<pre>PImage img;\n\nvoid setup(){\n img = loadImage(\"image_quend.jpg\");\n size(100,100);\n image(img,0,0,100,100);\n}<\/pre>\n<\/div>\n<p>La manipulation d&rsquo;images sous Processing permet aussi d&rsquo;obtenir la valeur color\u00e9e d&rsquo;un pixel d&rsquo;une image. Pour ce faire, on utilise la commande <code><strong>get(x,y);<\/strong><\/code>, o\u00f9 <code>x<\/code> et <code>y<\/code> sont l&rsquo;abscisse et l&rsquo;ordonn\u00e9e du point dont on veut conna\u00eetre la valeur. Par exemple pour conna\u00eetre la valeur color\u00e9e du point (30,40) de l&rsquo;image <code>img<\/code>, il me suffit d&rsquo;\u00e9crire :<\/p>\n<div class=\"code\">\n<pre>color c = img.get(30,40);<\/pre>\n<\/div>\n<p>Dans ce cas pr\u00e9cis, la couleur obtenue est stock\u00e9e dans une variable de type color nomm\u00e9e <code>c<\/code>. Je peux ensuite utiliser cette couleur comme nous l&rsquo;avons vu dans de pr\u00e9c\u00e9dents chapitres, par exemple avec <code>background(c);<\/code> ou <code>fill(c);<\/code> ou encore <code>stroke(c);<\/code>. Je peux aussi d\u00e9composer la couleur en extrayant sa valeur dans les rouges, dans les verts ou dans les bleux (respectivement : <code>red(c)<\/code>, <code>green(c)<\/code> et <code>blue(c)<\/code>) ou encore en v\u00e9rifiant sa luminosit\u00e9 (<code>brightness(c)<\/code>), etc.<br \/>\nLa fonction <code>get(x,y)<\/code> est donc sym\u00e9trique \u00e0 <code>point(x,y)<\/code>, \u00e0 cette diff\u00e9rence pr\u00e8s qu&rsquo;avec la fonction <code>get()<\/code>, les coordonn\u00e9es du point doivent imp\u00e9rativement \u00eatre des nombres de type entier (sans virgule). On peut donc \u00e9crire <code>get(10,10)<\/code> mais pas <code>get(10.5,10.9)<\/code>.<br \/>\nSi l&rsquo;on ne sp\u00e9cifie pas l&rsquo;image que l&rsquo;on veut manipuler (par exemple si l&rsquo;on \u00e9crit <code>get(10,10)<\/code> et non <code>monImage.get(10,10)<\/code>, c&rsquo;est toute la fen\u00eatre de l&rsquo;application qui est prise en compte.<\/p>\n<p>Passons \u00e0 un cas pratique. Dans le programme qui suit, nous allons v\u00e9rifier la couleur d&rsquo;un point pr\u00e9cis de l&rsquo;image tous les dix pixels. Puis nous allons v\u00e9rifier la luminosit\u00e9 de ce point (sur une \u00e9chelle de 0 \u00e0 255) et transformer celle-ci en une valeur allant de 0 \u00e0 10 par l&rsquo;utilisation de la fameuse r\u00e8gle de trois<sup><a href=\"#footnote_2_2890\" id=\"identifier_2_2890\" class=\"footnote-link footnote-identifier-link\" title=\"Pour transformer une valeur comprise entre 0 et 255 en une valeur allant de 0 &agrave; 10, la formule est : valeur sur 255 divis&eacute;e par 255.0 puis multipli&eacute;e par 10. Par exemple (255\/255.0)*10 = 10 ; (0\/255.0)*10 = 0 ; (128\/255.0)*10 = 5 ; etc.\">2<\/a><\/sup> .<br \/>\nEnsuite, un rectangle est dessin\u00e9 sur la sc\u00e8ne avec la couleur du point test\u00e9, \u00e0 l&#8217;emplacement de ce point et avec une taille correspondant \u00e0 la valeur de 1 \u00e0 10 qui a \u00e9t\u00e9 calcul\u00e9e. La boucle it\u00e9rative (for(int a=0;a&lt;&#8230;) sert \u00e0 parcourir successivement les points de l&rsquo;image.<\/p>\n<div class=\"code\">\n<pre>PImage monImage;\nnoStroke();smooth();\nbackground(0);\nmonImage = loadImage(\"image_quend.jpg\");\nsize(monImage.width,monImage.height);\nfor(int a=0;a&lt;width;a+=10){\n for(int b=0;b&lt;height;b+=10){\n   color c=monImage.get(a,b);\n   fill(c);\n   float t=( brightness(c)\/255.0)*10;\n   rect(a,b,t,t);\n }\n}<\/pre>\n<\/div>\n<p>Voil\u00e0 l&rsquo;image qui r\u00e9sulte de ces calculs :<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-medium wp-image-2918\" src=\"\/dernier\/files\/2008\/12\/quend4.jpg\" alt=\"\" width=\"530\" height=\"213\" srcset=\"https:\/\/hyperbate.fr\/dernier\/files\/2008\/12\/quend4.jpg 530w, https:\/\/hyperbate.fr\/dernier\/files\/2008\/12\/quend4-300x120.jpg 300w\" sizes=\"(max-width: 530px) 100vw, 530px\" \/><\/p>\n<p>On peut imaginer de nombreuses manipulations avec la commande <code>get()<\/code> et les commandes de dessin (<code>point()<\/code>, <code>rect()<\/code>, <code>ellipse()<\/code>, etc.). On peut en fait facilement cr\u00e9er des filtres de traitement d&rsquo;image comme le flou, le \u00ab\u00a0virage\u00a0\u00bb vers une couleur, l&rsquo;ajout de bruit, etc.<\/p>\n<p>Parmi les autres commandes \u00e0 conna\u00eetre, mentionnons copy() et blend().<br \/>\nCes deux commandes sont en apparence assez similaires \u00e0 la commande image() que nous avons vu au d\u00e9but de l&rsquo;article mais elles permettent d&rsquo;extraire une partie pr\u00e9cise d&rsquo;une image et de la copier \u00e0 des coordonn\u00e9es et dans une taille pr\u00e9cise de l&rsquo;image. La syntaxe de <code>copy()<\/code> est la suivante :<\/p>\n<p><code><strong>copy(monImage, x, y, largeur, hauteur, dx, dy, largeur_destination, hauteur_destination);<\/strong><\/code><\/p>\n<p>o\u00f9 <code>x<\/code> et <code>y<\/code> sont les coordonn\u00e9es du point sup\u00e9rieur gauche de la portion d&rsquo;image que l&rsquo;on veut copier. Les dimensions de cette portion d&rsquo;image sont <code>largeur<\/code> et <code>hauteur<\/code>. <code>dx<\/code> et <code>dy<\/code> sont les coordonn\u00e9es auxquelles va \u00eatre copi\u00e9e l&rsquo;image et\u00a0<code>largeur_destination<\/code> et\u00a0<code>hauteur_destination<\/code> sont la largeur et la hauteur du rectangle dans lequel va \u00eatre copi\u00e9e la portion d&rsquo;image. Si le param\u00e8tre <code>monImage<\/code> est omis, la commande s&rsquo;appliquera \u00e0 la fen\u00eatre de Processing.<br \/>\nQuand \u00e0 la commande <code>blend()<\/code>, elle s&rsquo;utilise comme suit :<\/p>\n<p><code><strong>blend(monImage, x, y, largeur, hauteur, \u00a0dx, dy, largeur_destination, hauteur_destination, MODE);<\/strong><\/code><\/p>\n<p>Sa syntaxe et sont fonctionnement sont identiques \u00e0 ceux de la commande pr\u00e9c\u00e9dente si ce n&rsquo;est qu&rsquo;un dernier param\u00e8tre est ajout\u00e9, le \u00ab\u00a0mode\u00a0\u00bb. Ce mode est un mode de superposition classique (identique \u00e0 ce que propose Photoshop ou \u00e0 ce que l&rsquo;on appelle les \u00ab\u00a0encres\u00a0\u00bb dans Director par exemple) qui peut \u00eatre <code>ADD<\/code>, <code>SUBTRACT<\/code>, <code>DARKEST<\/code>, <code>LIGHTEST<\/code>,\u00a0<code>BLEND<\/code>,\u00a0<code>DIFFERENCE<\/code>, <code>EXCLUSION<\/code>,\u00a0<code>MULTIPLY<\/code>,\u00a0<code>SCREEN<\/code>, <code>OVERLAY<\/code>,\u00a0<code>HARD_LIGHT<\/code>, \u00a0<code>SOFT_LIGHT<\/code>, <code>DODGE<\/code> ou\u00a0<code>BURN<\/code> (toujours \u00e9crit de cette mani\u00e8re, en majuscules).<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-medium wp-image-2925\" src=\"\/dernier\/files\/2008\/12\/quend5.jpg\" alt=\"\" width=\"530\" height=\"153\" srcset=\"https:\/\/hyperbate.fr\/dernier\/files\/2008\/12\/quend5.jpg 530w, https:\/\/hyperbate.fr\/dernier\/files\/2008\/12\/quend5-300x86.jpg 300w\" sizes=\"(max-width: 530px) 100vw, 530px\" \/><\/p>\n<p>Cette nouvelle image a \u00e9t\u00e9 obtenue avec le programme suivant :<\/p>\n<div class=\"code\">\n<pre>PImage monImage;\nsize(524,100); background(255,0,0);\nmonImage = loadImage(\"image_quend.jpg\");\nblend(monImage, 0, 0, 100, 100,  20, 10, 80, 80, BLEND);\nblend(monImage, 0, 0, 100, 100,  120, 10, 80, 80, ADD);\nblend(monImage, 0, 0, 100, 100,  220, 10, 80, 80, SUBTRACT);\nblend(monImage, 0, 0, 100, 100,  320, 10, 80, 80, LIGHTEST);\nblend(monImage, 0, 0, 100, 100,  420, 10, 80, 80, DARKEST);<\/pre>\n<\/div>\n<p>Tout d&rsquo;abord, le fond de la fen\u00eatre est \u00ab\u00a0peint\u00a0\u00bb en rouge (<code>background(255,0,0)<\/code>) puis les 100&#215;100 premiers pixels de notre image de d\u00e9part sont copi\u00e9s et r\u00e9tr\u00e9cis \u00e0 la taille de 80&#215;80 pixels. Ils sont appliqu\u00e9s sur notre fond rouge avec plusieurs modes : <code>BLEND<\/code>, <code>ADD<\/code>, <code>SUBTRACT<\/code>, <code>LIGHTEST<\/code> et <code>DARKEST<\/code>.<\/p>\n<p>Il existe un moyen alternatif extr\u00eamement performant pour manipuler les images en agissant directement sur la liste des pixels de l&rsquo;image. Pour cela on utilise les fonctions <code>loadPixels()<\/code>, <code>updatePixels()<\/code> et le tableau d&rsquo;entiers <code>pixels[]<\/code>. Nous ne verrons pas cela aujourd&rsquo;hui.<\/p>\n<p>Pour finir, signalons que l&rsquo;on peut aussi charger et afficher dans Processing des images vectorielles<sup><a href=\"#footnote_3_2890\" id=\"identifier_3_2890\" class=\"footnote-link footnote-identifier-link\" title=\"Une image vectorielle n&rsquo;est pas un canevas de points comme une image bitmap mais contient la description g&eacute;om&eacute;trique de formes\">3<\/a><\/sup> au format SVG (facile \u00e0 cr\u00e9er avec Illustrator par exemple) avec les commande <code>loadShape()<\/code> et <code>shape()<\/code>. Nous ne verrons pas cela aujourd&rsquo;hui non plus.<\/p>\n<ol class=\"footnotes\"><li id=\"footnote_1_2890\" class=\"footnote\"> Si l&rsquo;on veut emp\u00eacher le programme de s&rsquo;ex\u00e9cuter tant que l&rsquo;image n&rsquo;est pas charg\u00e9e (ce qui est pratique sur Internet par exemple), on peut remplacer <code>loadImage()<\/code> par\u00a0<code>requestImage()<\/code>.\u00a0<span class=\"footnote-back-link-wrapper\"> [<a href=\"#identifier_1_2890\" class=\"footnote-link footnote-back-link\">&#8617;<\/a>]<\/span><\/li><li id=\"footnote_2_2890\" class=\"footnote\"> Pour transformer une valeur comprise entre 0 et 255 en une valeur allant de 0 \u00e0 10, la formule est : valeur sur 255 divis\u00e9e par 255.0 puis multipli\u00e9e par 10. Par exemple (255\/255.0)*10 = 10 ; (0\/255.0)*10 = 0 ; (128\/255.0)*10 = 5 ; etc. <span class=\"footnote-back-link-wrapper\"> [<a href=\"#identifier_2_2890\" class=\"footnote-link footnote-back-link\">&#8617;<\/a>]<\/span><\/li><li id=\"footnote_3_2890\" class=\"footnote\"> Une image vectorielle n&rsquo;est pas un canevas de points comme une image bitmap mais contient la description g\u00e9om\u00e9trique de formes <span class=\"footnote-back-link-wrapper\"> [<a href=\"#identifier_3_2890\" class=\"footnote-link footnote-back-link\">&#8617;<\/a>]<\/span><\/li><\/ol>","protected":false},"excerpt":{"rendered":"<p>Apr\u00e8s les variables, les boucles et les objets, d\u00e9compressons un peu avec les images. Processing est capable de charger un fichier graphique en m\u00e9moire et de le manipuler de diverses fa\u00e7ons notamment en l&rsquo;affichant, en obtenant la valeur color\u00e9e d&rsquo;un point pr\u00e9cis ou en dessinant sur cette image. Les principes sont simples mais il y [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[40],"tags":[],"class_list":["post-2890","post","type-post","status-publish","format-standard","hentry","category-processing"],"_links":{"self":[{"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=\/wp\/v2\/posts\/2890","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2890"}],"version-history":[{"count":0,"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=\/wp\/v2\/posts\/2890\/revisions"}],"wp:attachment":[{"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2890"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2890"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hyperbate.fr\/dernier\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2890"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}