<?xml 
version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://arts-numeriques.codedrops.net/spip.php?page=backend.xslt" ?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel xml:lang="fr">
	<title>Arts num&#233;riques</title>
	<link>https://arts-numeriques.codedrops.net/</link>
	<description>artsnumeriques est le support des cours de St&#233;phane Noel, professeur &#224; l'&#233;cole de recherche graphique.</description>
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="http://arts-numeriques.codedrops.net/spip.php?id_rubrique=50&amp;page=backend" rel="self" type="application/rss+xml" />




<item xml:lang="fr">
		<title>Assembler un texte &#195; partir de 3 sources diff&#195;&#169;rentes</title>
		<link>http://arts-numeriques.codedrops.net/Assembler-un-texte-a-partir-de-3-sources-differentes</link>
		<guid isPermaLink="true">http://arts-numeriques.codedrops.net/Assembler-un-texte-a-partir-de-3-sources-differentes</guid>
		<dc:date>2021-03-19T11:03:56Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>St&#233;phane Noel</dc:creator>



		<description>
&lt;p&gt;Un script simple pour assembler des portions de texte provenant de 3 sources diff&#195;&#169;rentes. &lt;br class='autobr' /&gt; Ce code utilise les StringList, qui permettent une manipulation plus facile des Strings que les simples variables tableaux : la fonction shuffle() permet un m&#195;&#169;lange des Strings, et remove() permet de supprimer la String d&#195;&#169;j&#195; utilis&#195;&#169;e. &lt;br class='autobr' /&gt;
&#195;&#8225;a donne ceci en terme de code : String petit=&#034;lion_en_societe.txt&#034; ; String moyen=&#034;loup_chien.txt&#034; ; String grand=&#034;mouche_lion.txt&#034; ; &lt;br class='autobr' /&gt;
// la stringlist de (&#8230;)&lt;/p&gt;


-
&lt;a href="http://arts-numeriques.codedrops.net/-Traitement-du-texte-" rel="directory"&gt;Traitement du texte&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Un script simple pour assembler des portions de texte provenant de 3 sources diff&#195;&#169;rentes.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Ce code utilise les StringList, qui permettent une manipulation plus facile des Strings que les simples variables tableaux : la fonction shuffle() permet un m&#195;&#169;lange des Strings, et remove() permet de supprimer la String d&#195;&#169;j&#195; utilis&#195;&#169;e.&lt;/p&gt;
&lt;p&gt;&#195;&#8225;a donne ceci en terme de code :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;String petit=&#034;lion_en_societe.txt&#034;; String moyen=&#034;loup_chien.txt&#034;; String grand=&#034;mouche_lion.txt&#034;; // la stringlist de textes r&#195;&#169;cup&#195;&#169;r&#195;&#169;s StringList mix; //Les 3 textes sous forme de stringlist aussi StringList t1; StringList t2; StringList t3; void setup() { size(600, 800); } void draw() { // on recharge les textes &#195; chaque tour, sinon la liste se vide au fur et &#195; mesure // remplir la premi&#195;&#168;re stringlist t1=new StringList(); t1 = remplit(t1, petit); // remplir la deuxi&#195;&#168;me stringlist t2=new StringList(); t2 = remplit(t2, moyen); // remplir la troisi&#195;&#168;me stringlist t3=new StringList(); t3 = remplit(t3, grand); background(255); fill(0); // initaliser la stringlist mix = new StringList(); for (int i=0; i&lt;2; i++) { mix.append(portion(t1)); //appel de fonction } for (int i=0; i&lt;3; i++) { mix.append(portion(t2)); //appel de fonction } for (int i=0; i&lt;5; i++) { mix.append(portion(t3)); //appel de fonction } mix.shuffle(); // mettre &#195;&#167;a dans un array traditionnel String[] textes = mix.array(); // transformer l'array en une seule string String resultat = join(textes, &#034;\n&#034;); textSize(10); text(resultat, 20, 20, width-40, height); // saveFrame(); noLoop(); } String portion(StringList lequel) { String retour=&#034;&#034;; int phasard=int(random(lequel.size())); retour=lequel.get(phasard); // enlever l'&#195;&#169;l&#195;&#169;ment utilis&#195;&#169; de la StringList lequel.remove(phasard); println(&#034;la stringlist fait maintenant &#034;+lequel.size()); return retour; } // remplit les stringlists avec les textes StringList remplit(StringList s, String t) { String[] t_complet=loadStrings(t); for (int i=0; i&lt;t_complet.length; i++) { s.append(t_complet[i]); } println(t+&#034; a maintenant &#034;+s.size()+&#034; lignes&#034;); return s; } void keyPressed() { loop(); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		
		<enclosure url="http://arts-numeriques.codedrops.net/IMG/zip/pioche_texte_student_help.zip" length="4463" type="application/zip" />
		

	</item>
<item xml:lang="fr">
		<title>Une image comme ensemble de particules</title>
		<link>http://arts-numeriques.codedrops.net/Une-image-comme-ensemble-de-particules</link>
		<guid isPermaLink="true">http://arts-numeriques.codedrops.net/Une-image-comme-ensemble-de-particules</guid>
		<dc:date>2021-03-15T10:49:44Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>St&#233;phane Noel</dc:creator>



		<description>
&lt;p&gt;Un script permettant de reposser les pixels avec la souris et sauver un pdf. &lt;br class='autobr' /&gt; Le code prend un portrait de Flaubert, remplacez l'image par la v&#195;&#180;tre. &lt;br class='autobr' /&gt; // detruire un dessin import processing.pdf.* ; boolean saveOneFrame = false ; &lt;br class='autobr' /&gt;
String image_source=&#034;flaubert.jpg&#034; ; &lt;br class='autobr' /&gt;
ArrayList pix ; PImage im ; float nbx=120.0 ; float nby=120.0 ; int zone_influence=15 ; boolean show_stroke=false ; &lt;br class='autobr' /&gt;
void setup() im=loadImage(image_source) ; size(634,800) ; pix=new ArrayList() ; for (float (&#8230;)&lt;/p&gt;


-
&lt;a href="http://arts-numeriques.codedrops.net/-Exemples-" rel="directory"&gt;int&#195;&#169;raction et calcul&lt;/a&gt;


		</description>


 <content:encoded>&lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L119xH150/arton650-b12af.jpg?1767160577' class='spip_logo spip_logo_right' width='119' height='150' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Un script permettant de reposser les pixels avec la souris et sauver un pdf.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Le code prend un portrait de Flaubert, remplacez l'image par la v&#195;&#180;tre.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// detruire un dessin import processing.pdf.*; boolean saveOneFrame = false; String image_source=&#034;flaubert.jpg&#034;; ArrayList&lt;pixel&gt; pix; PImage im; float nbx=120.0; float nby=120.0; int zone_influence=15; boolean show_stroke=false; void setup() { im=loadImage(image_source); size(634,800); pix=new ArrayList&lt;pixel&gt;(); for (float px=0;px&lt;width;px+=width/nbx) { for (float py=0;py&lt;height;py+=height/nby) { color c=im.get(int(px), int(py)); if (brightness(c) &lt; 250) { pix.add(new pixel(px, py, c, width/nbx, height/nby)); } } } rectMode(CENTER); } void draw() { if (saveOneFrame == true) { beginRecord(PDF, &#034;Line.pdf&#034;); } background(255); noStroke(); for (int i = 0; i &lt;pix.size(); i++) { pixel cf=pix.get(i); cf.affiche(); cf.choc(); } stroke(255, 0, 0); noFill(); if (saveOneFrame == true) { endRecord(); saveOneFrame = false; } else { ellipse(mouseX, mouseY, zone_influence*2, zone_influence*2); } } void keyPressed() { if (key==' ') { if (show_stroke==false) { show_stroke=true; } else { show_stroke=false; } } if(key == 's'){ saveOneFrame = true; } if (key=='x') { for (int i = 0; i &lt;pix.size(); i++) { pixel cf=pix.get(i); cf.position.x=cf.pox; cf.position.y=cf.poy; } } } class pixel { float tx, ty; float pox, poy; PVector position, deplacement; color c; pixel(float px, float py, color co, float tx, float ty) { pox=px; poy=py; position=new PVector(px, py); deplacement=new PVector(0, 0); c=co; this.tx=tx; this.ty=ty; } void affiche() { if (show_stroke==true) { float dx=mouseX-(position.x); float dy=mouseY-(position.y); stroke(map(dist(position.x, position.y, pox, poy), 0, width/2, 0, 255)); line(pox, poy, position.x, position.y); noStroke(); } fill(c); rect(position.x, position.y, tx, ty); // reduire la vitesse deplacement.div(1.1); position.x+=deplacement.x; position.y+=deplacement.y; } void choc() { float dx=mouseX-(position.x); float dy=mouseY-(position.y); if (abs(dx)&lt;zone_influence &amp;&amp; abs(dy)&lt;zone_influence) { float d=map(dist(position.x, position.y, mouseX, mouseY), 0, 100, 0.1, 1.1); deplacement.x=-dx*d; deplacement.y=-dy*d; } } }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		
		<enclosure url="http://arts-numeriques.codedrops.net/IMG/zip/particules_image.zip" length="432445" type="application/zip" />
		

	</item>
<item xml:lang="fr">
		<title>Dessiner avec vertex()</title>
		<link>http://arts-numeriques.codedrops.net/Dessiner-avec-vertex</link>
		<guid isPermaLink="true">http://arts-numeriques.codedrops.net/Dessiner-avec-vertex</guid>
		<dc:date>2020-04-20T15:13:20Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>St&#233;phane Noel</dc:creator>



		<description>
&lt;p&gt;On peut dessiner des formes avec line() et ellipse(), rect(), etc. Mais il existe d'autres m&#195;&#169;thodes de dessin, notamment vertex() et curveVertex(), qui permettent de dessiner des formes complexes sur base de lignes ou de courbes. &lt;br class='autobr' /&gt; beginShape(), Vertex() et endShape() La fonction Vertex() s'utilise &#195; l'int&#195;&#169;rieur de deux fonctions : beginShape() et endShape(), qui servent &#195; d&#195;&#169;limiter le dessin. &lt;br class='autobr' /&gt; beginShape() ; vertex(20,20) ; vertex(780,20) ; endShape() ; &lt;br class='autobr' /&gt;
vertex() d&#195;&#169;finit un (&#8230;)&lt;/p&gt;


-
&lt;a href="http://arts-numeriques.codedrops.net/-Couverture-generative-les-codes-utiles-" rel="directory"&gt;Cours distant : couverture g&#195;&#169;n&#195;&#169;rative, les codes utiles&lt;/a&gt;


		</description>


 <content:encoded>&lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L150xH150/arton615-d40d5.jpg?1781356641' class='spip_logo spip_logo_right' width='150' height='150' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;On peut dessiner des formes avec line() et ellipse(), rect(), etc.&lt;br class='autobr' /&gt;
Mais il existe d'autres m&#195;&#169;thodes de dessin, notamment vertex() et curveVertex(), qui permettent de dessiner des formes complexes sur base de lignes ou de courbes.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;beginShape(), Vertex() et endShape()&lt;/h2&gt;
&lt;p&gt;La fonction Vertex() s'utilise &#195; l'int&#195;&#169;rieur de deux fonctions : beginShape() et endShape(), qui servent &#195; d&#195;&#169;limiter le dessin.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; beginShape(); vertex(20,20); vertex(780,20); endShape(); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;vertex() d&#195;&#169;finit un point dans l'espace avec deux arguments en x et y (dans le cas d'un espace 2D). Parce qu'elles sont &#195;&#169;crites entre beginShape() et endShape(), les diff&#195;&#169;rents vertex() sont reli&#195;&#169;s entre eux. On peut relier autant de points que l'on veut.&lt;/p&gt;
&lt;p&gt;On peut aussi fermer la forme de mani&#195;&#168;re automatique en rajoutant un argument dans endShape(), comme ceci :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; beginShape(); vertex(20,20); vertex(780,20); vertex(750,750); vertex(20,780); endShape(CLOSE);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span class='spip_document_1151 spip_documents spip_documents_center'&gt;&lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH500/square-f512d.jpg?1781356642' width='500' height='500' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Avec un peu de random, &#195;&#167;a donnerait &#195;&#167;a :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; fill(255,0,0); beginShape(); for(int i=0;i&lt;40;i++){ vertex(random(20,width-20), random(20,height-20)); } endShape(CLOSE);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span class='spip_document_1152 spip_documents spip_documents_center'&gt;&lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH500/square2-c529e.jpg?1781356642' width='500' height='500' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;ou encore :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; fill(0); noStroke(); for (int x=15; x&lt;width-10; x+=30) { for (int y=15; y&lt;height-10; y+=30) { beginShape(); vertex(random(x-5, x+5), random(y-5, y+5)); vertex(random(x+15, x+25), random(y-5, y+5)); vertex(random(x+15, x+25), random(y+15, y+25)); vertex(random(x-5, x+5), random(y+15, y+25)); endShape(CLOSE); } }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span class='spip_document_1153 spip_documents spip_documents_center'&gt;&lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH500/square2-2-175a6.jpg?1781356642' width='500' height='500' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Chargement d'un fichier texte</title>
		<link>http://arts-numeriques.codedrops.net/Chargement-d-un-fichier-texte</link>
		<guid isPermaLink="true">http://arts-numeriques.codedrops.net/Chargement-d-un-fichier-texte</guid>
		<dc:date>2020-04-20T14:05:49Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>St&#233;phane Noel</dc:creator>



		<description>
&lt;p&gt;Processing peut charger un texte tr&#195;&#168;s simplement. Mais il faut juste &#195;&#170;tre au fait de ce qu'est un array, en fran&#195;&#167;ais &#034;variable tableau&#034;. &lt;br class='autobr' /&gt; Quel type de fichier charger ? La fonction loadStrings() de Processing permet de charger un texte &#195; partir d'un fichier .txt. C'est la forme la plus basique d'un fichier texte : pas d'indication de police, pas d'image, pas de mise en page, de gras, d'italique, rien que des caract&#195;&#168;res de texte, des retours &#195; la ligne. Ne tentez pas de charger un (&#8230;)&lt;/p&gt;


-
&lt;a href="http://arts-numeriques.codedrops.net/-Couverture-generative-les-codes-utiles-" rel="directory"&gt;Cours distant : couverture g&#195;&#169;n&#195;&#169;rative, les codes utiles&lt;/a&gt;


		</description>


 <content:encoded>&lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L150xH113/arton614-2157c.jpg?1781356642' class='spip_logo spip_logo_right' width='150' height='113' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Processing peut charger un texte tr&#195;&#168;s simplement. Mais il faut juste &#195;&#170;tre au fait de ce qu'est un array, en fran&#195;&#167;ais &#034;variable tableau&#034;.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Quel type de fichier charger ? &lt;/h2&gt;
&lt;p&gt;La fonction loadStrings() de Processing permet de charger un texte &#195; partir d'un fichier .txt. C'est la forme la plus basique d'un fichier texte : pas d'indication de police, pas d'image, pas de mise en page, de gras, d'italique, rien que des caract&#195;&#168;res de texte, des retours &#195; la ligne. &lt;br class='autobr' /&gt;
Ne tentez pas de charger un fichier .rtf ou pire encore, un .doc ou un .pdf car ce sont des format de fichier plus complexes, qui contiennent du texte mais aussi des tas d'informations qui concernent la mise en page, les typos, des images, etc. &lt;br class='autobr' /&gt;
On peut exporter un fichier txt &#195; partir de word, de textEdit, d'openOffice et des autres logiciels de traitement de texte assez facilement.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;LoadStrings() et sa variable tableau&lt;/h2&gt;
&lt;p&gt;Pour charger un texte, on &#195;&#169;crira ceci :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;String[] montexte=loadStrings(&#034;KarlMarx.txt&#034;);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette ligne de code va stocker dans la variable montexte le contenu du fichier KarlMarx.txt. Vous l'avez remarqu&#195;&#169;, il y a deux crochet apr&#195;&#168;s le type de variable String[]. &#195;&#8225;a signifie &#195; Processing que la variable montexte est un tableau.&lt;/p&gt;
&lt;p&gt;Une variable tableau (array en anglais) est une variable qui contient non pas un seul &#195;&#169;l&#195;&#169;ment mais une liste d'&#195;&#169;l&#195;&#169;ments. On peut l'&#195;&#169;crire comme &#195;&#167;a :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;String[] fruits={ &#034;pomme&#034;,&#034;poire&#034;,&#034;ananas&#034; };&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ensuite, on peut atteindre chacun des &#195;&#169;l&#195;&#169;ments de cette liste individuellement : le premier &#195;&#169;l&#195;&#169;ment de la liste est l'&#195;&#169;l&#195;&#169;ment 0, qu'on peut atteindre comme ceci :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;text(fruits[0],100,100); // pomme text(fruits[1],100,150); // poire text(fruits[2],100,200); // ananas&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;C'est l&#195; que les brackets (c'est leur nom) trouvent leur raison d'&#195;&#170;tre : il permettent d'acc&#195;&#169;der &#195; chacun des &#195;&#169;l&#195;&#169;ments de la liste en sp&#195;&#169;cifiant leur place dans celle-ci.&lt;/p&gt;
&lt;p&gt;Dans le cas de notre fichier texte, chaque &#195;&#169;l&#195;&#169;ments de la variable montexte est une ligne de texte, c'est-&#195; -dire tout ce qui est s&#195;&#169;par&#195;&#169; par un retour &#195; la ligne.&lt;/p&gt;
&lt;p&gt;Du coup, on peut savoir combien de lignes se trouvent dans le fichier en utilisant la propri&#195;&#169;t&#195;&#169; &lt;i&gt;length&lt;/i&gt; comme ceci :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;String[] montexte=loadStrings(&#034;KarlMarx.txt&#034;); println(&#034;nombre de lignes : &#034;+montexte.length);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dans mon cas, on obtient dans la console (en bas dans la fenetre de Processing) : &#034;nombre de lignes : 5970&#034;.&lt;/p&gt;
&lt;p&gt;Du coup, on peut demander le contenu de la premi&#195;&#168;re ligne comme ceci :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;String[] montexte=loadStrings(&#034;KarlMarx.txt&#034;); text(montexte[0],10,30); // afficher la premi&#195;&#168;re ligne&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Afficher ligne par ligne&lt;/h2&gt;
&lt;p&gt;A partir de l&#195; , on peut on peut faire un script pour afficher ligne par ligne le contenu du fichier .txt&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;String[] montexte; int compteur=0; void setup() { size(800, 600); montexte=loadStrings(&#034;KarlMarx.txt&#034;); fill(0); } void draw() { background(255); text(montexte[compteur], 10, 30,700,500); // afficher la premi&#195;&#168;re ligne compteur++; // ajouter 1 &#195; compteur if(compteur &gt;= montexte.length){ // si on arrive &#195; la fin compteur=0; // recommencer au d&#195;&#169;but } noLoop(); } void keyPressed(){ loop(); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Assembler toutes les lignes en un seul grand texte&lt;/h2&gt;
&lt;p&gt;Dans certains cas, on veut pouvoir disposer d'un seul grand texte, pour l'analyser plus facilement ou pour le s&#195;&#169;parer en phrase (c'est &#195; dire quelque chose qui se termine par un point, un point d'interrogation, etc.). &lt;br class='autobr' /&gt;
Dans ce cas, on va utiliser une fonction qui s'appelle join.&lt;br class='autobr' /&gt;
Join est une fonction qui re&#195;&#167;oit une variable tableau de texte et les rassemble en un seul contenu de type String. Voici un exemple :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;String texte_complet; void setup() { size(800, 600); String[] montexte=loadStrings(&#034;KarlMarx.txt&#034;); texte_complet=join(montexte,&#034;, &#034;); fill(0); } void draw() { background(255); text(texte_complet, 10, 30,700,500); // afficher la premi&#195;&#168;re ligne noLoop(); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;D&#195;&#169;couper le texte en plusieurs morceaux&lt;/h2&gt;
&lt;p&gt;Une fois le texte rassembl&#195;&#169;, on peut le traiter avec diff&#195;&#169;rentes fonctions. Je vous renvoie &#195; un &lt;a href='http://arts-numeriques.codedrops.net/Texte-Parcourir-un-texte-mot-par' class=&#034;spip_in&#034;&gt;tutoriel sur ce site qui parle sp&#195;&#169;cifique de &#195;&#167;a&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Parcourir une phrase lettre par lettre</title>
		<link>http://arts-numeriques.codedrops.net/Parcourir-une-phrase-lettre-par-lettre</link>
		<guid isPermaLink="true">http://arts-numeriques.codedrops.net/Parcourir-une-phrase-lettre-par-lettre</guid>
		<dc:date>2020-04-19T16:59:56Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>St&#233;phane Noel</dc:creator>



		<description>
&lt;p&gt;Processing peut &#195;&#169;videmment utiliser du texte comme un ensemble de donn&#195;&#169;es. On peut par exemple parcourir une phrase lettre par lettre. &lt;br class='autobr' /&gt; Une phrase est une liste de lettres On stocke une phrase dans Processing dans une variable de type &#034;String&#034;. String maphrase=&#034;Ceci est une phrase&#034; ; &lt;br class='autobr' /&gt;
On peut afficher cette phrase avec la fonction text() : text(maphrase, 10,10) ; &lt;br class='autobr' /&gt;
Mais on peut aussi acc&#195;&#169;der &#195; chacun des caract&#195;&#168;res de cette String, avec charAt() par exemple : (&#8230;)&lt;/p&gt;


-
&lt;a href="http://arts-numeriques.codedrops.net/-Couverture-generative-les-codes-utiles-" rel="directory"&gt;Cours distant : couverture g&#195;&#169;n&#195;&#169;rative, les codes utiles&lt;/a&gt;


		</description>


 <content:encoded>&lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L150xH143/arton613-68653.jpg?1781356642' class='spip_logo spip_logo_right' width='150' height='143' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Processing peut &#195;&#169;videmment utiliser du texte comme un ensemble de donn&#195;&#169;es. On peut par exemple parcourir une phrase lettre par lettre.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Une phrase est une liste de lettres&lt;br class='autobr' /&gt;
On stocke une phrase dans Processing dans une variable de type &#034;String&#034;.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;String maphrase=&#034;Ceci est une phrase&#034;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On peut afficher cette phrase avec la fonction text() :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;text(maphrase, 10,10);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Mais on peut aussi acc&#195;&#169;der &#195; chacun des caract&#195;&#168;res de cette String, avec charAt() par exemple :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;text(maphrase.charAt(0),10,10);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette ligne de code affichera le caract&#195;&#168;re n&#194;&#176;0 de la phrase, c'est-&#195; -dire &#034;C&#034;.&lt;/p&gt;
&lt;p&gt;On peut cdonc faire un script simple pour afficher caract&#195;&#168;re par caract&#195;&#168;re cette phrase :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;PFont mapolice; int marges=30; String maphrase=&#034;Ceci est un texte martyr&#034;; int compteur=0; void setup(){ size(600,600); mapolice=createFont(&#034;Montserrat-bold&#034;,20); textFont(mapolice,240); textAlign(CENTER,CENTER); } void draw(){ background(255); fill(0); text(maphrase.charAt(compteur),width/2,height/2); compteur++; if(compteur &gt;= maphrase.length()){ compteur=0; } noLoop(); } void keyPressed(){ loop(); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Une fonction pour faire une grille de lettres&lt;/h2&gt;
&lt;p&gt;Ce script comporte une fonction &#034;grille_caracteres()&#034; &#195; qui on donne une phrase, un nombre de caract&#195;&#168;re dans la grille et une taille de caract&#195;&#168;re. De l&#195; , il affiche cette phrase en grille. Lorsque tout les caract&#195;&#168;res de la phrase ont &#195;&#169;t&#195;&#169; affich&#195;&#169;, le code revient au premi&#195;&#168;re caract&#195;&#168;re de la phrase.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;PFont mapolice; int marges=30; void setup(){ size(800,600); mapolice=createFont(&#034;Montserrat-bold&#034;,20); textFont(mapolice,24); } void draw(){ background(255); fill(0); // dans les parenth&#195;&#168;ses : // texte, nombre de lettre par ligne et colonne, taille du caract&#195;&#168;re grille_caracteres(&#034;Ceci est un texte martyr&#034;,60,10); } void grille_caracteres(String texte,int nb, int taille){ int compteur=0; textSize(taille); textAlign(CENTER,CENTER); // calcul de l'espacement float saut_x=(width-marges*2)/nb; float saut_y=(height-marges*2)/nb; // dessiner la grille avec un double boucle for(float y=marges;y&lt;=height-marges;y+=saut_y){ for(float x=marges;x&lt;=width-marges;x+=saut_x){ text(texte.charAt(compteur),x,y); compteur++; if(compteur &gt;= texte.length()){ compteur=0; } } } }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Aller plus loin&lt;/h2&gt;
&lt;p&gt;Allez faire un tour dans Processing sur la documentation de String, et sur ce site sur la partie &#034;&lt;a href='http://arts-numeriques.codedrops.net/-Traitement-du-texte-' class=&#034;spip_in&#034;&gt;Traitement du texte&lt;/a&gt;&#034;, qui contient un paquet de script avec lesquels chipoter.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Lire une vid&#195;&#169;o, image par image</title>
		<link>http://arts-numeriques.codedrops.net/Lire-une-video-image-par-image</link>
		<guid isPermaLink="true">http://arts-numeriques.codedrops.net/Lire-une-video-image-par-image</guid>
		<dc:date>2020-04-19T15:41:54Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>St&#233;phane Noel</dc:creator>



		<description>
&lt;p&gt;Processing peut lire des vid&#195;&#169;os ! Plut&#195;&#180;t que la lire simplement, il peut la parcourir et en extraire des images. Quelques d&#195;&#169;mos de code cool pour voir &#195;&#167;a. &lt;br class='autobr' /&gt; Quels fichiers vid&#195;&#169;o lire ? Processing peut lire les conteneurs mov et mp4 mais aussi anarchiquement d'autres fichiers, les avi ou les mkv par exemple, mais certains fichiers ne passent pas, c'est une question de conteneur et de codec, parfois c'est un myst&#195;&#168;re. Un copier/coller d'un bout d'article &#195;&#169;crit ailleurs sur ce site : (&#8230;)&lt;/p&gt;


-
&lt;a href="http://arts-numeriques.codedrops.net/-Couverture-generative-les-codes-utiles-" rel="directory"&gt;Cours distant : couverture g&#195;&#169;n&#195;&#169;rative, les codes utiles&lt;/a&gt;


		</description>


 <content:encoded>&lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L150xH132/arton612-1c9a6.jpg?1781356642' class='spip_logo spip_logo_right' width='150' height='132' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Processing peut lire des vid&#195;&#169;os ! Plut&#195;&#180;t que la lire simplement, il peut la parcourir et en extraire des images. Quelques d&#195;&#169;mos de code cool pour voir &#195;&#167;a.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Quels fichiers vid&#195;&#169;o lire ?&lt;/h2&gt;
&lt;p&gt;Processing peut lire les conteneurs mov et mp4 mais aussi anarchiquement d'autres fichiers, les avi ou les mkv par exemple, mais certains fichiers ne passent pas, c'est une question de conteneur et de codec, parfois c'est un myst&#195;&#168;re. Un copier/coller d'un bout d'article &#195;&#169;crit ailleurs sur ce site :&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Codecs&lt;/h2&gt;
&lt;p&gt;Un &lt;a href=&#034;http://fr.wikipedia.org/wiki/Codec&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;codec&lt;/a&gt; est un dispositif de compression/d&#195;&#169;compression, c'est &#195; dire une suite d'op&#195;&#169;ration permettant, &#195; partir d'un fichier num&#195;&#169;rique, d'en faire une version compress&#195;&#169;e, c'est &#195; dire plus l&#195;&#169;g&#195;&#168;re, c'est &#195; dire stock&#195;&#169;e sur moins d'espace m&#195;&#169;moire. le MPG2 par exemple, est employ&#195;&#169; pour faire circuler les images vid&#195;&#169;os par satellite. &lt;br class='manualbr' /&gt;A partir de ce fichier compress&#195;&#169;, le codec permet, &#195; travers d'algorithmes de d&#195;&#169;compression, de retrouver la version originale du fichier.&lt;br class='manualbr' /&gt;Il existe des codecs sans perte (un fichier zipp&#195;&#169; puis d&#195;&#169;zipp&#195;&#169; sera identique &#195; l'original) ou avec perte (une image compress&#195;&#169; en jpeg ou en mp3 on perdu dans l'op&#195;&#169;ration une partie de la qualit&#195;&#169; du fichier original). On dit dans le deuxi&#195;&#168;me cas que la compression est destructive.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Un rappel sur la diff&#195;&#169;rence entre conteneur et codec&lt;/h2&gt;
&lt;p&gt;Il faut bien rappeler que les formats AVI, MKV, MOV et MP4 ne sont pas des &#034;formats video&#034; mais des &lt;strong&gt;conteneurs&lt;/strong&gt;. A l'int&#195;&#169;rieur, on va trouver diff&#195;&#169;rentes codecs et m&#195;&#170;me d'autres choses. Dans un MKV par exemple on trouvera plusieurs fichiers audio et des fichiers de sous-titres. Ceci permet de choisir sa langue et ses sous-titres sans devoir changer de fichier, via le menu du lecteur.&lt;br class='manualbr' /&gt;On regardera donc quels sont les codecs employ&#195;&#169;s pour compresser les flux vid&#195;&#169;o et audio. Voici les codecs plus relevants actuellement :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;a href=&#034;http://fr.wikipedia.org/wiki/H.264&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;H.264&lt;/a&gt; est un format sous licence, on le trouve dans le format mp4, mv4 ou Flv.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;a href=&#034;http://fr.wikipedia.org/wiki/Theora&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Theora&lt;/a&gt; est un format libre, que l'on retrouve dans le format ogg.
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; &lt;a href=&#034;https://fr.wikipedia.org/wiki/VP8&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;VP8&lt;/a&gt;, achet&#195;&#169; par google puis vers&#195;&#169; dans le domaine public. On le trouve dans le format webm.&lt;/p&gt;
&lt;p&gt;En son, on trouvera le &lt;a href=&#034;http://fr.wikipedia.org/wiki/MPEG-1/2_Audio_Layer_3&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;MP3&lt;/a&gt;, le &lt;a href=&#034;http://fr.wikipedia.org/wiki/Aac&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;AAC&lt;/a&gt; et &lt;a href=&#034;http://fr.wikipedia.org/wiki/Vorbis&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Vorbis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;l'industrie se met rarement d'accord sur un standard, car les ing&#195;&#169;nieurs n'aiment pas partager leur trouvailles avec leurs concurrents ni se sentir tenus de respecter des r&#195;&#168;gles de productions partag&#195;&#169;es pendant leurs recherches. Les firmes qui les commercialisent veulent aussi, la plupart du temps, les int&#195;&#169;grer dans un ecosyst&#195;&#168;me d'applications dont ils ont par ailleurs la licence (comme le format AAC de Apple, inclus dans le conteneur MP4, utilis&#195;&#169; par Itunes). Enfin, les solutions propri&#195;&#169;taires obligent les clients (nous) &#195; acqu&#195;&#169;rir licences, mat&#195;&#169;riels et logiciels : plus de supports, plus d'outils, plus de contenus. Ce ne sont pas les lecteurs B&#195;&#169;tamax et V2000 qui me contrediront.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Un exemple de base&lt;/h2&gt;
&lt;p&gt;La librairie &lt;strong&gt;vid&#195;&#169;o&lt;/strong&gt; de Processing ne doit pas &#195;&#170;tre t&#195;&#169;l&#195;&#169;charg&#195;&#169;e : elle est pr&#195;&#169;sente dans la version de base de Processing. Elle est accompagn&#195;&#169;e de quelques exemples, vous pourrez voir qu'elle peut aussi r&#195;&#169;cup&#195;&#169;rer des images d'une webcam, et vous trouverez des exemples dans le module Processing sur ce site.&lt;/p&gt;
&lt;p&gt;Dans les exemples officiels de Processing, celui-ci :&lt;br class='autobr' /&gt;
&lt;a href=&#034;https://processing.org/reference/libraries/video/Movie_available_.html&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://processing.org/reference/libraries/video/Movie_available_.html&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='java spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;import processing.video.*; Movie myMovie; void setup() { size(200, 200); frameRate(30); myMovie = new Movie(this, &#034;totoro.mov&#034;); myMovie.loop(); } void draw() { if (myMovie.available()) { myMovie.read(); } image(myMovie, 0, 0); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce code suppose qu'une vid&#195;&#169;o du nom de totoro.mov (de type mov, hein, il ne faut surtout pas renommer l'extension d'un fichier avi en mov par exemple, &#195;&#167;a ne marche pas !).&lt;br class='autobr' /&gt;
Ce fichier doit &#195;&#170;tre plac&#195;&#169; dans le dossier &#034;data&#034; du script. Pour faire &#195;&#167;a, il suffit de jeter le fichier sur la fen&#195;&#170;tre du script et il sera copi&#195;&#169; dans le bon dossier.&lt;/p&gt;
&lt;p&gt;La premi&#195;&#168;re chose qui est faite par ce script est de charger la librairie vid&#195;&#169;o et d&#195;&#169;clarer un objet :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;import processing.video.*; Movie myMovie;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La premi&#195;&#168;re ligne charge un gros paquet de code qui permet la suite du script, c'est le code de la classe video. C'est donc &#195;&#169;videmment important de ne pas l'oublier.&lt;/p&gt;
&lt;p&gt;Ensuite on cr&#195;&#169;e un objet de type vid&#195;&#169;o en lui donnant un nom, comme pour n'importe quelle variable, ici &#034;myMovie&#034;.&lt;/p&gt;
&lt;p&gt;Puis, dans le setup(), on va faire &#034;d&#195;&#169;marrer&#034; l'objet :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;myMovie = new Movie(this, &#034;totoro.mov&#034;); myMovie.loop();&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Remarquez que c'est &#195; cet endroit que l'on donne &#195; l'objet l'adresse du fichier vid&#195;&#169;o, ici &#034;totoro.mov&#034;. La ligne suivant est facultative, elle met en lecture en boucle la vid&#195;&#169;o.&lt;/p&gt;
&lt;p&gt;Dans le draw(), on va trouver le code suivant :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;if (myMovie.available()) { myMovie.read(); } image(myMovie, 0, 0); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;mymovie.read() est une fonction qui comme son nom l'indique, lit une image de la vid&#195;&#169;o en temps r&#195;&#169;el. Pour &#195;&#169;viter des erreurs de calcul, ce code est mis dans un &#034;if&#034; qui v&#195;&#169;rifie qu'une image est disponible &#195; la lecture, ce qui &#195;&#169;vite que la fonction read() ne renvoie une image noire parce que le code est occup&#195;&#169; &#195; charger et que l'image n'est pas encore disponible entre deux frames.&lt;/p&gt;
&lt;p&gt;Ce code n'est qu'une des mani&#195;&#168;re d'avoir acc&#195;&#168;s &#195; une vid&#195;&#169;o, il en existe des variantes qui n'utilise pas avalaible().&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Remplir une grille d'images vid&#195;&#169;o&lt;/h2&gt;
&lt;p&gt;Pour donner un exemple, voici un code qui remplit une surface d'images vid&#195;&#169;o en temps r&#195;&#169;el :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;import processing.video.*; Movie myMovie; int marges=50; int x=marges; int y=marges; // la vid&#195;&#169;o a une taille de 720 X 405 pixels // je vais afficher des vignettes 10 X plus petites int taille_x=72; int taille_y=40; void setup() { size(1000,800); background(255); frameRate(10); // 10 images secondes au max myMovie = new Movie(this, &#034;zephetach_niki_paris.mp4&#034;); myMovie.loop(); } void draw() { if (myMovie.available()) { myMovie.read(); image(myMovie, x, y, taille_x, taille_y); x+=taille_x; // si on d&#195;&#169;passe &#195; droite, aller &#195; la ligne suivante if(x+taille_x &gt; width-marges){ y+=taille_y; x=marges; if(y+taille_y &gt; height-marges){ saveFrame(); // effacer et commencer une nouvelle image background(255); x=marges; y=marges; } } } }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt; Ce qui donne ceci :&lt;br class='autobr' /&gt;
&lt;span class='spip_document_1150 spip_documents spip_documents_center'&gt;&lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH400/screen-0204-16719.jpg?1781356642' width='500' height='400' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;D'autres scripts vid&#195;&#169;o sur ce site&lt;/h2&gt;
&lt;p&gt;Allez voir la partie &#034;&lt;a href='http://arts-numeriques.codedrops.net/-Traitement-video-' class=&#034;spip_in&#034;&gt;Traitement vid&#195;&#169;o&lt;/a&gt;&#034; de ce site.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Exemple 6 : tramer du texte avec PGraphics</title>
		<link>http://arts-numeriques.codedrops.net/Tramer-du-texte-avec-PGraphics</link>
		<guid isPermaLink="true">http://arts-numeriques.codedrops.net/Tramer-du-texte-avec-PGraphics</guid>
		<dc:date>2020-03-29T14:26:01Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>St&#233;phane Noel</dc:creator>



		<description>
&lt;p&gt;Le tutoriel pr&#195;&#169;c&#195;&#169;dent utilisait PGraphics. On va s'int&#195;&#169;resser un peu plus &#195; ce jeu de fonctions, qui permettent de cr&#195;&#169;er des images avec du code, sans fichier pr&#195;&#169;existant. &lt;br class='autobr' /&gt; PImage et PGraphics PImage, on l'a vu, permet de charger une image depuis un fichier. On cr&#195;&#169;e un espace dans la m&#195;&#169;moire vive, puis on y charge le contenu d'une image depuis le disque dur ou le r&#195;&#169;seau. &lt;br class='autobr' /&gt;
PGraphics est un objet diff&#195;&#169;rent. Il permet de cr&#195;&#169;er une image vide qu'on va ensuite pourvoir remplir (&#8230;)&lt;/p&gt;


-
&lt;a href="http://arts-numeriques.codedrops.net/-Couverture-generative-les-codes-utiles-" rel="directory"&gt;Cours distant : couverture g&#195;&#169;n&#195;&#169;rative, les codes utiles&lt;/a&gt;


		</description>


 <content:encoded>&lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L150xH90/arton602-f561b.jpg?1781356642' class='spip_logo spip_logo_right' width='150' height='90' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Le tutoriel pr&#195;&#169;c&#195;&#169;dent utilisait PGraphics. On va s'int&#195;&#169;resser un peu plus &#195; ce jeu de fonctions, qui permettent de cr&#195;&#169;er des images avec du code, sans fichier pr&#195;&#169;existant.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;PImage et PGraphics&lt;br class='autobr' /&gt;
PImage, on l'a vu, permet de charger une image depuis un fichier. On cr&#195;&#169;e un espace dans la m&#195;&#169;moire vive, puis on y charge le contenu d'une image depuis le disque dur ou le r&#195;&#169;seau.&lt;/p&gt;
&lt;p&gt;PGraphics est un objet diff&#195;&#169;rent. Il permet de cr&#195;&#169;er une image vide qu'on va ensuite pourvoir remplir d'&#195;&#169;l&#195;&#169;ments graphiques : lignes, points, rectangles, mais aussi des images ou du texte.&lt;/p&gt;
&lt;p&gt;Un premier exemple :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;void setup(){ size(600,400); } void draw(){ background(255); // cr&#195;&#169;er l'&#195;&#169;l&#195;&#169;ment PGraphics uneimage=createGraphics(500,300); uneimage.beginDraw(); // d&#195;&#169;marrer les modifications uneimage.background(255,255,0); uneimage.line(0,0,500,500); uneimage.endDraw(); // fin des modifications // afficher l'image image(uneimage,50,50); // sauver l'image uneimage.save(&#034;truc.jpg&#034;); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce code donne ceci :&lt;br class='autobr' /&gt;
&lt;span class='spip_document_1102 spip_documents spip_documents_center'&gt;&lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH300/truc-904b9.jpg?1727082080' width='500' height='300' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Comme on le voit sur cet exemple, on cr&#195;&#169;e une variable d'un type particulier &#034;PGraphics&#034;, et on doit sp&#195;&#169;cifier lors de sa cr&#195;&#169;ation sa taille en pixels. Ici, 500 sur 300 pixels.&lt;br class='autobr' /&gt;
Pour modifier l'image, il faut d'abord l'ouvrir &#195; l'&#195;&#169;dition par la commande beginDraw(). Chaque vois que je m'adresse &#195; l'image, je sp&#195;&#169;cifie d'abord son nom, et je lui associe la commande choisie.&lt;br class='autobr' /&gt;
Apr&#195;&#168;s avoir ouvert l'image &#195; l'&#195;&#169;dition, je lui place un fond jaune, puis j'y dessine une ligne avant de refermer le fichier avec endDraw().&lt;br class='autobr' /&gt;
On peut placer toutes les commandes graphiques d&#195;&#169;j&#195; vues par ce moyen : ellipse, fill, stroke, etc.&lt;br class='autobr' /&gt;
Il ne faut pas oublier de refermer le fichier, sans quoi on ne peut pas afficher l'image.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Ecrire dans PGraphics&lt;/h2&gt;
&lt;p&gt;Ecrire dans PGraphics suit la m&#195;&#170;me logique : on va charger une police dans le script, la choisir et &#195;&#169;crire un texte comme ceci :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;PFont mapolice1; void setup() { size(600, 400); mapolice1=createFont(&#034;Montserrat-Bold&#034;, 20); } void draw() { background(255); // cr&#195;&#169;er l'&#195;&#169;l&#195;&#169;ment PGraphics uneimage=createGraphics(500, 300); uneimage.beginDraw(); // d&#195;&#169;marrer les modifications uneimage.fill(0); uneimage.textFont(mapolice1, 110); uneimage.text(&#034;Waow&#034;,20,150); uneimage.endDraw(); // fin des modifications // afficher l'image image(uneimage, 50, 50); // sauver l'image uneimage.save(&#034;truc.jpg&#034;); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Passez le texte-image dans la fonction de tramage&lt;/h2&gt;
&lt;p&gt;Une fois que ce texte est devenu une image, il peut &#195;&#170;tre manipul&#195;&#169; comme n'importe quelle image. Dans notre cas, on peut tramer cette image avec la fonction image_sample() &lt;a href='http://arts-numeriques.codedrops.net/Combiner-deux-fonctions-pour-tramer-des-images' class=&#034;spip_in&#034;&gt;pr&#195;&#169;sent&#195;&#169;e dans le tutoriel pr&#195;&#169;c&#195;&#169;dent&lt;/a&gt;, l&#195;&#169;g&#195;&#168;rement modifi&#195;&#169;e pour l'occasion.&lt;/p&gt;
&lt;p&gt;Le script complet :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;PFont mapolice1; void setup() { size(700, 400); mapolice1=createFont(&#034;Montserrat-Bold&#034;, 20); } void draw() { background(255); // cr&#195;&#169;er l'&#195;&#169;l&#195;&#169;ment PGraphics uneimage=createGraphics(600, 180); uneimage.beginDraw(); // d&#195;&#169;marrer les modifications uneimage.background(255); // un fond blanc, n&#195;&#169;cessaire uneimage.fill(0); uneimage.textAlign(CENTER,CENTER); uneimage.textFont(mapolice1, 170); uneimage.text(&#034;Waow&#034;,300,70); uneimage.endDraw(); // fin des modifications tramer_image(uneimage, 20, 20, 8,8); image(uneimage,20,200); // sauver l'image saveFrame(&#034;test-###.jpg&#034;); noLoop(); } void tramer_image(PImage sample, int x, int y,int pixx, int pixy) { pushMatrix(); translate(x, y); // dessiner la grille avec un double boucle for (float gx=0; gx&lt;sample.width; gx+=pixx) { for (float gy=0; gy&lt;sample.height; gy+=pixy) { color c=sample.get(int(gx), int(gy)); // faire quelque chose avec la couleur ici stroke(c); line(gx,gy,gx+pixx,gy+pixy); } } popMatrix(); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span class='spip_document_1103 spip_documents spip_documents_center'&gt;&lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH286/test-001-da55c.jpg?1781356642' width='500' height='286' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Une variante avec un filtre sur l'image&lt;/h2&gt;
&lt;p&gt;En utilisant la fonction filter(), on peut modifier l'image, comme ici la flouter.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; // flouter uneimage.filter(BLUR, 6); tramer_image(uneimage, 20, 20, 8,8);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span class='spip_document_1104 spip_documents spip_documents_center'&gt;&lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH286/test-001-blur-1c79b.jpg?1781356643' width='500' height='286' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Exemple 5 : combiner deux fonctions pour tramer des images</title>
		<link>http://arts-numeriques.codedrops.net/Combiner-deux-fonctions-pour-tramer-des-images</link>
		<guid isPermaLink="true">http://arts-numeriques.codedrops.net/Combiner-deux-fonctions-pour-tramer-des-images</guid>
		<dc:date>2020-03-29T12:57:56Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>St&#233;phane Noel</dc:creator>



		<description>
&lt;p&gt;Ce script reprend le script pr&#195;&#169;c&#195;&#169;dent et l'associe avec un script de tramage de l'image. Sur cette base, des exp&#195;&#169;rimentations peuvent &#195;&#170;tre faites tout en gardant le contr&#195;&#180;le sur le r&#195;&#169;sultat. &lt;br class='autobr' /&gt; Une fonction dans une fonction La fonction &#195;&#169;crite dans le script pr&#195;&#169;c&#195;&#169;dent permettait de pr&#195;&#169;lever une portion d'image &#195; une taille choisie. Nous allons la combiner &#195; un script de tramage, ce qui permettra de cr&#195;&#169;er des patterns et des mise en pages plus int&#195;&#169;ressantes. &lt;br class='autobr' /&gt;
L'id&#195;&#169;e du script (&#8230;)&lt;/p&gt;


-
&lt;a href="http://arts-numeriques.codedrops.net/-Couverture-generative-les-codes-utiles-" rel="directory"&gt;Cours distant : couverture g&#195;&#169;n&#195;&#169;rative, les codes utiles&lt;/a&gt;


		</description>


 <content:encoded>&lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L113xH150/arton597-5e702.jpg?1781356643' class='spip_logo spip_logo_right' width='113' height='150' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Ce script reprend le script pr&#195;&#169;c&#195;&#169;dent et l'associe avec un script de tramage de l'image. Sur cette base, des exp&#195;&#169;rimentations peuvent &#195;&#170;tre faites tout en gardant le contr&#195;&#180;le sur le r&#195;&#169;sultat.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Une fonction dans une fonction&lt;/h2&gt;
&lt;p&gt;La &lt;a href='http://arts-numeriques.codedrops.net/Une-image-au-format-choisi-a-l-endroit-choisi' class=&#034;spip_in&#034;&gt;fonction &#195;&#169;crite dans le script pr&#195;&#169;c&#195;&#169;dent&lt;/a&gt; permettait de pr&#195;&#169;lever une portion d'image &#195; une taille choisie. Nous allons la combiner &#195; un script de tramage, ce qui permettra de cr&#195;&#169;er des patterns et des mise en pages plus int&#195;&#169;ressantes.&lt;/p&gt;
&lt;p&gt;L'id&#195;&#169;e du script est de :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; pr&#195;&#169;lever une portion d'image d'une taille choisie
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; l'analyser pour en faire une version plus grossi&#195;&#168;re
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; afficher cette trame &#195; un endroit choisi&lt;/p&gt;
&lt;p&gt;Il y a donc 7 arguments &#195; envoyer &#195; la fonction :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; le nom de l'image
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; la coordonn&#195;&#169;e o&#195;&#185; afficher le r&#195;&#169;sultat sur l'axe horizontal
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; la coordonn&#195;&#169;e o&#195;&#185; afficher le r&#195;&#169;sultat sur l'axe vertical
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; la largeur de la portion en pixels
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; la hauteur de la portion en pixels&lt;br class='autobr' /&gt;
Plus :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; la taille des samples en largeur
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; la taille des samples en hauteur&lt;br class='autobr' /&gt;
&#195;&#8225;a commence &#195; faire beaucoup, mais &#195;&#167;a vaut le coup&lt;/p&gt;
&lt;p&gt;Voici cette fonction (qui s'ajoute donc &#195; celle d&#195;&#169;j&#195; &#195;&#169;crite dans le &lt;a href='http://arts-numeriques.codedrops.net/Une-image-au-format-choisi-a-l-endroit-choisi' class=&#034;spip_in&#034;&gt;tutoriel pr&#195;&#169;c&#195;&#169;dent&lt;/a&gt;) :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// image sample place une grille downsampl&#195;&#169;e void image_sample(String source, int x, int y, int largeur, int hauteur,int pixx, int pixy) { noStroke(); // retirer le filet au cas o&#195;&#185; // la fonction get_sample renvoie un recadrage de l'image dans le format demand&#195;&#169; PImage sample=get_sample(source, largeur, hauteur); pushMatrix(); translate(x, y); // dessiner la grille avec un double boucle for (float gx=0; gx&lt;=sample.width; gx+=pixx) { for (float gy=0; gy&lt;=sample.height; gy+=pixy) { color c=sample.get(int(gx), int(gy)); // faire quelque chose avec la couleur ici fill(c); rect(gx,gy,pixx,pixy); } } popMatrix(); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette fonction utilise &lt;a href=&#034;https://processing.org/reference/pushMatrix_.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;pushMatrix&lt;/a&gt;, &lt;a href=&#034;https://processing.org/reference/popMatrix_.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;popMatrix()&lt;/a&gt; et &lt;a href=&#034;https://processing.org/reference/translate_.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;translate()&lt;/a&gt;, trois fonctions li&#195;&#169;es, que je ne d&#195;&#169;cris pas maintenant.&lt;/p&gt;
&lt;p&gt;Apr&#195;&#168;s avoir cr&#195;&#169;&#195;&#169; l'image recard&#195;&#169;e avec la fonction get_sample(), l'image est analys&#195;&#169;e avec une double boucle et dans ce prermier exemple, on obtient une image tram&#195;&#169;e grossi&#195;&#168;rement :&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_1073 spip_documents spip_documents_center'&gt;&lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH667/ada-8442b.jpg?1781356644' width='500' height='667' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;On dispose de tous les arguments de la fonction pour fabriquer des images diff&#195;&#169;rentes : position dans l'espace, taille de la trame, etc.&lt;/p&gt;
&lt;div class=&#034;galerie_embed&#034;&gt; &lt;ul class=&#034;galerie_liste flexit clearfix&#034;&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/couverture-001.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1074,1075,1076,1077,1078&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/1306b22b9cb4af91ff0d627b2cf821-04f67.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/cccouverture-001.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1074,1075,1076,1077,1078&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/147d08aa77f2e1f760fac29ed057fc-a834d.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/ccouverture-001.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1074,1075,1076,1077,1078&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/9754eca6bdbe6ad4e58ff506503082-13b6b.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/bcouverture-001.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1074,1075,1076,1077,1078&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/2bf11a3436d19bd530d002bcb413a1-627c5.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/acouverture-001.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1074,1075,1076,1077,1078&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/d892e151346254829815be7dc31939-daf35.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Modifier le coeur de la fonction&lt;/h2&gt;
&lt;p&gt;Mais on peut aussi modifier des parties de la fonction, et la partie centrale de celle-ci est l'int&#195;&#169;rieur de la double boucle.&lt;br class='autobr' /&gt;
On peut ainsi remplacer&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; fill(c); rect(gx,gy,pixx,pixy); &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;par :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; stroke(c); strokeWeight(1); line(gx,gy+pixy/2,gx+pixx,gy+pixy/2);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;et obtenir ceci&lt;br class='autobr' /&gt;
&lt;span class='spip_document_1079 spip_documents spip_documents_center'&gt;&lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH667/couverture-001-2-a60f0.jpg?1781356644' width='500' height='667' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;ou encore&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; stroke(c); strokeWeight(1); line(gx,gy+pixy/2,gx+pixx,gy+pixy/2); line(gx+pixx/2,gy,gx+pixx/2,gy+pixy);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ou encore&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;fill(c); ellipse(gx+pixx/2,gy+pixy/2,pixx*0.8,pixy*0.8);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Assembler les codes&lt;/h2&gt;
&lt;p&gt;En combinant le code de base, le choix de la portion, de la position et de la trame, on peut g&#195;&#169;n&#195;&#169;rer des couvertures int&#195;&#169;ressantes :&lt;/p&gt;
&lt;div class=&#034;galerie_embed&#034;&gt; &lt;ul class=&#034;galerie_liste flexit clearfix&#034;&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/acouverture-002.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/3501a9795e343892226b7d4bd529f2-d91ac.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/acouverture-006.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/30e3fa0924279812bac1434fafd2ae-e7fe9.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/bcouverture-010.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/7bbcdbf47689f3b5df5c6402d1ec4d-dba6a.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/bcouverture-016.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/871ac6034e737df5415b032d50af1e-2a86b.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/bcouverture-022.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/1244fcd18274d28a00b8cf06460b9f-f07ff.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/ccouverture-019.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/64669eaaffe33360b605ecfb7108a2-73b41.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/ccouverture-022.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/789fabf5f5119c572eb9fba8ef9313-8a4e5.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/ccouverture-028.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/40aa9c14f16e140ba39f037816fa5b-387f9.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/dcouverture-016.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/99759832f1acfa4bd92c93512f6661-3c292.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/dcouverture-024.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/2a6a3a9d43c3467deb004b80b33321-f4421.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/ecouverture-011.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/70e6cf2a44eb5f0531fdbea5787aef-130f1.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/fcouverture-005.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/c90d180231ec3fc153a06db00d2607-61f5f.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/gcouverture-001.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/802bb3e92f0c3fa54c31f4ddef9019-c932c.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/hcouverture-023.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/5b70b67e9e0d372a50c7150751ad23-09aef.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/icouverture-008.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/374b8441a99e5d11873ebec9fe545d-4bbac.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/jcouverture-006.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/4de15665cb4aa6e24e2bb951cfd3c0-94699.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/ccouverture-001-2.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/4378367977d350d38b34770122c48f-11ab9.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/couverture-001-4.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/37430fedd96f3d36fa0ac44c4bc9ef-85ea9.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/couverture-001-5.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/e0eaaf5920064c10a120bd8a44bc02-15c33.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;li&gt; &lt;a href=&#034;https://arts-numeriques.codedrops.net/IMG/jpg/couverture-001-6.jpg&#034; class=&#034;fancybox&#034; rel=&#034;rgp1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101&#034; alt=&#034;photo GP&#034; &gt; &lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L160xH200/2b740300e887bca276a1296e5ec386-635ac.jpg?1728830233' width='160' height='200' /&gt; &lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Exemple 4 : Une image au format choisi &#195; l'endroit choisi</title>
		<link>http://arts-numeriques.codedrops.net/Une-image-au-format-choisi-a-l-endroit-choisi</link>
		<guid isPermaLink="true">http://arts-numeriques.codedrops.net/Une-image-au-format-choisi-a-l-endroit-choisi</guid>
		<dc:date>2020-03-29T12:09:30Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>St&#233;phane Noel</dc:creator>



		<description>
&lt;p&gt;Dans ce tutoriel nous allons cr&#195;&#169;er une fonction qui d&#195;&#169;coupe une portion d'image &#195; une taille choisie. Ceci permettra de combiner un appel de fonction avec un retour de fonction, une nouvelle notion. &lt;br class='autobr' /&gt; Une fonction avec un &#034;retour de fonction&#034; Un article concernant les fonctions d&#195;&#169;taillait les raisons pour lesquelles on les emploie, comment les &#195;&#169;crire et les appeler. Une fonction est un ensemble d'instructions rassembl&#195;&#169;es sous un m&#195;&#170;me nom, que l'on peut appeler en lui envoyant des (&#8230;)&lt;/p&gt;


-
&lt;a href="http://arts-numeriques.codedrops.net/-Couverture-generative-les-codes-utiles-" rel="directory"&gt;Cours distant : couverture g&#195;&#169;n&#195;&#169;rative, les codes utiles&lt;/a&gt;


		</description>


 <content:encoded>&lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L120xH150/arton601-3fd32.jpg?1781356644' class='spip_logo spip_logo_right' width='120' height='150' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;Dans ce tutoriel nous allons cr&#195;&#169;er une fonction qui d&#195;&#169;coupe une portion d'image &#195; une taille choisie. Ceci permettra de combiner un appel de fonction avec un retour de fonction, une nouvelle notion.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Une fonction avec un &#034;retour de fonction&#034;&lt;/h2&gt;
&lt;p&gt;Un &lt;a href='http://arts-numeriques.codedrops.net/Qu-est-ce-qu-une-fonction-pourquoi-les-utiliser' class=&#034;spip_in&#034;&gt;article concernant les fonctions&lt;/a&gt; d&#195;&#169;taillait les raisons pour lesquelles on les emploie, comment les &#195;&#169;crire et les appeler. &lt;br class='autobr' /&gt;
Une fonction est un ensemble d'instructions rassembl&#195;&#169;es sous un m&#195;&#170;me nom, que l'on peut appeler en lui envoyant des arguments, c'est &#195; dire des informations sp&#195;&#169;cifiques que la fonction peut utiliser. Mais une fonction peut aussi, une fois son travail termin&#195;&#169;, &lt;i&gt;renvoyer&lt;/i&gt; quelque chose : un chiffre, une chaine de caract&#195;&#168;re ou m&#195;&#170;me une image.&lt;br class='autobr' /&gt;
La m&#195;&#169;taphore utilis&#195;&#169;e &#195; plusieurs reprises est celle du majordome &#195; qui on demande un caf&#195;&#169;. La fonction contient la s&#195;&#169;rie d'instructions permettant de faire le caf&#195;&#169;, et le caf&#195;&#169; est &#195;&#169;videmment rapport&#195;&#169; &#195; la fin de la proc&#195;&#169;dure. Le caf&#195;&#169; est dans ce cas le retour de fonction.&lt;br class='autobr' /&gt;
C'est l&#195; que le &#034;void&#034; qui pr&#195;&#169;c&#195;&#168;de les fonctions prend son sens. &lt;br class='autobr' /&gt;
Si nous cr&#195;&#169;ons une fonction pour ranger une chambre :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;void ranger_chambre(){ move(&#034;livres&#034;,&#034;&#195;&#169;tag&#195;&#168;re&#034;); move(&#034;linge sale&#034;,&#034;bac &#195; linge&#034;); aspirateur(); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La fonction, une fois appel&#195;&#169;e, permet de ranger une chambre, mais ne &lt;i&gt;renvoie&lt;/i&gt; rien. Une fois le travail fait, ben il est fait. L'appel se fait comme ceci :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;ranger_chambre();&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Mais dans le cas du majordome, on veut &#195; la fin de la s&#195;&#169;quence recevoir le caf&#195;&#169;. Le code sera plut&#195;&#180;t :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;caf&#195;&#169; prepare_un_cafe(int nb_sucres){ chauffer_eau(); mettre_caf&#195;&#169;_dans_filtre(); verser_eau_bouillante(); verser_cafe_dans_tasse(); // ajouter le bon nombre de sucres ajouter_sucre(nb_sucres); return caf&#195;&#169;; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le nom de la fonction commence dans ce cas nom pas par void mais par caf&#195;&#169;, qui annonce que la fonction renvoie, quand elle est ex&#195;&#169;cut&#195;&#169;e, un &#195;&#169;l&#195;&#169;ment de type caf&#195;&#169;. &lt;br class='autobr' /&gt;
Et en effet, la derni&#195;&#168;re ligne de la fonction &#034;return caf&#195;&#169;&#034; renvoie vers l'endroit o&#195;&#185; la fonction a &#195;&#169;t&#195;&#169; appel&#195;&#169;e le caf&#195;&#169;.&lt;/p&gt;
&lt;p&gt;La fonction s'appelle comme ceci :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;caf&#195;&#169; moncaf&#195;&#169;=prepare_un_cafe(0);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La variable moncaf&#195;&#169;, de type caf&#195;&#169;, sera &#034;remplie&#034; d'un caf&#195;&#169; sans sucre apr&#195;&#168;s l'appel de la fonction...&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Du concret avec une fonction &#034;get_sample()&#034;&lt;/h2&gt;
&lt;p&gt;Voil&#195; enfin cette fonction. Elle requiert 3 arguments :
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; le nom de l'image (juste son nom, la fonction charge l'image)
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; la largeur de l'image finale en pixels
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; la hauteur de l'image finale en pixels&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// cr&#195;&#169;er une image qui exploite le maximum de la surface du cadre demand&#195;&#169; PImage get_sample(String source, int largeur, int hauteur) { PImage im=loadImage(source); // creer une image au format d&#195;&#169;finitif PGraphics pg=createGraphics(largeur, hauteur); // Calculer le ratio largeur/hauteur du cadre et de l'image float ratio_cadre=(largeur*1.0)/(hauteur*1.0); float ratio_image=(im.width*1.0)/(im.height*1.0); // cr&#195;&#169;e une image temporaire en remplissant le cadre demand&#195;&#169; pg.beginDraw(); pg.background(255); if (ratio_cadre &lt; ratio_image) { println(&#034;cadre plus &#195;&#169;troit que l'image&#034;); float nl=hauteur*ratio_image; float px=random(-nl+largeur, 0); pg.image(im, px, 0, nl, hauteur); } else { println(&#034;cadre plus large que l'image&#034;); float nh=width/ratio_image; float py=random(-nh+hauteur, 0); pg.image(im, 0, py, largeur, nh); } pg.endDraw(); return pg; // renvoyer l'image produite }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette fonction utilise la fonction PGraphics, qui permet de cr&#195;&#169;er une image dans la m&#195;&#169;moire de l'ordinateur. Un outil puissant pour cr&#195;&#169;er des images &#195; partir de rien et dessiner dedans, mais qu'on utilise ici de mani&#195;&#168;re minimale.&lt;br class='autobr' /&gt;
On cr&#195;&#169;e une image vide au format demand&#195;&#169;, et on y place l'image envoy&#195;&#169;e par l'utilisateur en exploitant le maximum de celle-ci. Elle a d&#195;&#169;j&#195; fait &lt;a href='http://arts-numeriques.codedrops.net/Adapter-une-image-avec-recadrage' class=&#034;spip_in&#034;&gt;l'objet d'un tutoriel ici&lt;/a&gt; sous une forme l&#195;&#169;g&#195;&#168;rement diff&#195;&#169;rente.&lt;br class='autobr' /&gt;
Il y a deux cas de figure : si on adapte l'image &#195; la plus petite des deux dimensions de l'image, l'image va d&#195;&#169;passer en largeur ou en hauteur :&lt;br class='autobr' /&gt;
&lt;span class='spip_document_629 spip_documents spip_documents_center'&gt;&lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH292/crop-illu-2-186f8.png?1781356644' width='500' height='292' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;br class='autobr' /&gt;
Le script compare donc les deux tailles, celle de l'image et du recadrage demand&#195;&#169;, pour savoir comment disposer les deux. Il est une des multiples fa&#195;&#167;ons de r&#195;&#169;soudre ce probl&#195;&#168;me.&lt;/p&gt;
&lt;p&gt;Une fois la nouvelle image cr&#195;&#169;e avec PGraphics remplie avec l'image de l'utilisateur au bon format, elle est renvoy&#195;&#169;e par la fonction, qui doit r&#195;&#169;cup&#195;&#169;rer cette image comme ceci :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;PImage monimage=get_sample(&#034;nyan-cat-1280x720.jpg&#034;, 400,580); image(monimage,10,10);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Associ&#195;&#169; &#195; notre script de base de couverture, &#195;&#167;a peut donner &#195;&#167;a :&lt;/p&gt;
&lt;div style='border:1px solid #aaa'&gt;
&lt;span class='spip_document_1072 spip_documents spip_documents_center'&gt;&lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L500xH625/nyancouverture-009-12bba.jpg?1781356645' width='500' height='625' alt=&#034;&#034; /&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;Mais cette fonction peut servir de base &#195; d'autres scripts, et &#195;&#167;a c'est l'objet du tutoriel qui suit !&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Exporter une vid&#195;&#169;o avec Processing, Video export et ffmpeg</title>
		<link>http://arts-numeriques.codedrops.net/Exporter-une-video-avec-Processing-Video-export-et-ffmpeg</link>
		<guid isPermaLink="true">http://arts-numeriques.codedrops.net/Exporter-une-video-avec-Processing-Video-export-et-ffmpeg</guid>
		<dc:date>2020-03-28T16:23:46Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>St&#233;phane Noel</dc:creator>



		<description>
&lt;p&gt;L'exportation d'une vid&#195;&#169;o requiert l'installtion d'une librairie et de ffmpeg, une librairie open source puissante et utile (au moins pour ce script) &lt;br class='autobr' /&gt; Installer ffmpeg Pour des raisons de facilit&#195;&#169;, nous utiliserons homebrew, un utilitaire en ligne de commande, pour installer. 1) se rendre sur le site de Homebrew et copier la ligne de commande se trouvant dans le haut de la page 2) la coller dans le terminal et appuyer &#034;return&#034;. Homebrew s'installe sur votre ordinateur. 3) Une fois (&#8230;)&lt;/p&gt;


-
&lt;a href="http://arts-numeriques.codedrops.net/-Traitement-video-" rel="directory"&gt;Traitement vid&#195;&#169;o&lt;/a&gt;


		</description>


 <content:encoded>&lt;img src='http://arts-numeriques.codedrops.net/local/cache-vignettes/L150xH113/arton600-a02bb.jpg?1781356645' class='spip_logo spip_logo_right' width='150' height='113' alt=&#034;&#034; /&gt;
		&lt;div class='rss_chapo'&gt;&lt;p&gt;L'exportation d'une vid&#195;&#169;o requiert l'installtion d'une librairie et de ffmpeg, une librairie open source puissante et utile (au moins pour ce script)&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Installer ffmpeg&lt;/h2&gt;
&lt;p&gt;Pour des raisons de facilit&#195;&#169;, nous utiliserons homebrew, un utilitaire en ligne de commande, pour installer.&lt;br class='autobr' /&gt;
1) se rendre sur le site de &lt;a href=&#034;https://brew.sh/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Homebrew&lt;/a&gt; et copier la ligne de commande se trouvant dans le haut de la page&lt;br class='autobr' /&gt;
2) la coller dans le terminal et appuyer &#034;return&#034;. Homebrew s'installe sur votre ordinateur.&lt;br class='autobr' /&gt;
3) Une fois Homebrew install&#195;&#169;, tapez la commande &#034;brew install ffmpeg&#034; dans le terminal. Cette fois ffmpeg s'installe.&lt;/p&gt;
&lt;p&gt;Se r&#195;&#169;f&#195;&#169;rer &#195; la &lt;a href=&#034;https://github.com/fluent-ffmpeg/node-fluent-ffmpeg/wiki&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;documentation de ffmpeg&lt;/a&gt; pour plus d'infos&lt;/p&gt;
&lt;p&gt;Une fois cette op&#195;&#169;ration r&#195;&#169;alis&#195;&#169;e, on peut commencer &#195; &#195;&#169;crire notre script.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Installer la librairie pour Processing &#034;Vid&#195;&#169;o export&#034;&lt;/h2&gt;
&lt;p&gt;Allez dans sketch/importer une librairie/Ajouter une librairie, tapez &#034;video&#034; dans le moteur de recherche et s&#195;&#169;lectionnez &#034;Video export&#034; dans la liste.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Un script d'essai&lt;/h2&gt;
&lt;p&gt;Pour tester la chose, un script de base :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;import com.hamoid.*; VideoExport videoExport; int FPS = 30; int duree=60; // dur&#195;&#169;e en frame void setup() { size(768, 576); noStroke(); frameRate(FPS); videoExport = new VideoExport(this, &#034;monexport.mp4&#034;); videoExport.setFrameRate(FPS); videoExport.startMovie(); } void draw() { background(255); fill(random(255), 0, 0); textSize(30); text(&#034;WAOW&#034;, width/2, height/2 ); videoExport.saveFrame(); // stopper apr&#195;&#168;s le bon nombre de frames if (frameCount &gt; duree) { videoExport.endMovie(); exit(); } }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce qui donne ceci :&lt;/p&gt;
&lt;video id=&#034;video1069&#034; controls width=&#034;100%&#034; poster=&#034;plugins-dist/medias/prive/vignettes/mp4.svg&#034;&gt; &lt;source src=&#034;IMG/mp4/monexport.mp4&#034; type=&#034;video/mp4&#034;&gt; &lt;/video&gt; &lt;div class=&#034;base64javascript16201480686a2d5865558b08.26998118&#034; title=&#034;PHNjcmlwdD4KICAgICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICAgICAgICAgICBpbml0X3ZpZGVvKCIjdmlkZW8xMDY5Iik7IAogICAgICAgIH0pOwogICAgPC9zY3JpcHQ+&#034;&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Un test avec l'ajout d'un son (et son analyse)&lt;/h2&gt;
&lt;p&gt;Voici un second test avec la librairie sound pour le chargement d'un son et son analyse en temps r&#195;&#169;el :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;import processing.sound.*; import com.hamoid.*; VideoExport videoExport; int FPS = 30; SoundFile sample; Amplitude rms; float x,y; void setup() { size(768, 576); x=random(width); y=random(height); // copier/coller depuis l'exemple &#034;PeakAMplitude&#034; de la librairie &#034;Sound&#034; sample = new SoundFile(this, &#034;14 Prelude No. 14.mp3&#034;); sample.play(); rms = new Amplitude(this); rms.input(sample); frameRate(FPS); videoExport = new VideoExport(this, &#034;monexport.mp4&#034;); videoExport.setFrameRate(FPS); // associer le son videoExport.setAudioFileName(&#034;14 Prelude No. 14.mp3&#034;); videoExport.startMovie(); textAlign(CENTER, CENTER); background(255); } void draw() { // rms.analyze() renvoie un chiffre entre 0 et 1 // l'utiliser pour l'angle, la vitesse, la couleur float vitesse=rms.analyze()*100; stroke(map(rms.analyze(),0,0.6,255,0)); // noise plut&#195;&#180;t que random float angle=map(rms.analyze(),0,0.8,0,TWO_PI); float next_x=x+(sin(angle)*vitesse); float next_y=y+(cos(angle)*vitesse); line(x,y,next_x,next_y); x=next_x; y=next_y; if(x &gt; width){ x-=width; } if(x &lt; 0){x+=width; } if(y &gt; height){ y-=height; } if(y &lt; 0){ y+=height; } videoExport.saveFrame(); // arreter &#195; la fin du morceau if (!sample.isPlaying()) { videoExport.endMovie(); exit(); } }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce qui donne ceci :&lt;/p&gt;
&lt;video id=&#034;video1071&#034; controls width=&#034;100%&#034; poster=&#034;plugins-dist/medias/prive/vignettes/mp4.svg&#034;&gt; &lt;source src=&#034;IMG/mp4/monexport-2.mp4&#034; type=&#034;video/mp4&#034;&gt; &lt;/video&gt; &lt;div class=&#034;base64javascript16201480686a2d5865558b08.26998118&#034; title=&#034;PHNjcmlwdD4KICAgICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICAgICAgICAgICBpbml0X3ZpZGVvKCIjdmlkZW8xMDcxIik7IAogICAgICAgIH0pOwogICAgPC9zY3JpcHQ+&#034;&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		
		<enclosure url="http://arts-numeriques.codedrops.net/IMG/mp4/monexport.mp4" length="181497" type="video/mp4" />
		
		<enclosure url="http://arts-numeriques.codedrops.net/IMG/mp4/monexport-2.mp4" length="1713206" type="video/mp4" />
		

	</item>



</channel>

</rss>
