{"id":891,"date":"2019-07-07T19:35:43","date_gmt":"2019-07-07T17:35:43","guid":{"rendered":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/?page_id=891"},"modified":"2019-08-17T21:58:39","modified_gmt":"2019-08-17T19:58:39","slug":"4-2-importar-imatges","status":"publish","type":"page","link":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/4-2-importar-imatges\/","title":{"rendered":"4.2. Importar imatges"},"content":{"rendered":"<p>Fins ara hem creat dibuixos fets a partir de les formes que creem amb p5.js. Per\u00f2 amb p5.js podem importar imatges en format <strong>jpg<\/strong> o <strong>png<\/strong> i fer-les servir per a incloure-les als nostres programes, podent fer composicions m\u00e9s complexes.<\/p>\n<p>Per a poder treballar amb imatges necess\u00e0riament haurem de treballar en l\u00ednia, amb el servidor FTP de la UOC, at\u00e8s que per seguretat els navegadors no permeten la c\u00e0rrega d\u2019arxius de manera local.<\/p>\n<p>\u00c9s per aix\u00f2 que crearem una carpeta nova, a qu\u00e8 direm <strong>img<\/strong>, on guardarem les imatges que fem servir.<\/p>\n<h2>Organitzant l\u2019espai del servidor<\/h2>\n<p>Vegem quina ser\u00e0 l\u2019estructura que hem de tenir al servidor:<\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-full wp-image-254\" src=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_001.jpg\" alt=\"\" width=\"337\" height=\"119\" srcset=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_001.jpg 337w, http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_001-300x106.jpg 300w\" sizes=\"(max-width: 337px) 100vw, 337px\" \/><\/p>\n<p>Dins la carpeta <strong>js<\/strong> tindrem els dos arxius que ja ten\u00edem, el <strong>p5.min.js<\/strong> i l\u2019<strong>sketch.js<\/strong>.<\/p>\n<p>Dins la carpeta <strong>img<\/strong>, guardarem les imatges que venen com a exemple al llibre, disponibles per a baixar-les des d\u2019<a href=\"http:\/\/p5js.org\/learn\/books\/media.zip\" target=\"_blank\" rel=\"noopener\">http:\/\/p5js.org\/learn\/books\/media.zip<\/a>.<\/p>\n<p>Per a poder fer servir una imatge, haurem de fer tres passos previs:<\/p>\n<ol>\n<li>Copiar la imatge a la carpeta on tenim el nostre codi.<\/li>\n<li>Crear una variable que emmagatzemi la imatge.<\/li>\n<li>Carregar la imatge amb la funci\u00f3 <a href=\"https:\/\/p5js.org\/es\/reference\/#\/p5\/loadImage\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: Courier, Arial;\">loadImage()<\/span><\/a>.<\/li>\n<\/ol>\n<p><strong>Com farem aquests tres passos?<\/strong><\/p>\n<p>El primer pas ja l\u2019hem fet. Per a tenir els nostres fitxers ben organitzats, hem emmagatzemat les imatges en una carpeta que es diu <strong>img<\/strong>, per\u00f2 veurem que aix\u00f2 no influeix a l\u2019hora de fer els nostres programes.<\/p>\n<p>El segon i el tercer passos els veurem en aquest exemple:<\/p>\n<pre>var img;   \/\/ Definim una variable per a emmagatzemar la imatge\r\nfunction preload() {   \/\/ Afegim una nova funci\u00f3 que ens \r\n                       \/\/ carrega la imatge\r\n  img = loadImage(\"<span style=\"color: #f835fc; font-weight: bold;\">img\/lunar.jpg<\/span>\");\r\n}\r\nfunction setup() {\r\n  createCanvas(480, 120);\r\n}\r\nfunction draw() {\r\n  image(img, 0, 0); \/\/ Dibuixa la imatge\r\n}\r\n<\/pre>\n<p>La funci\u00f3 <span style=\"font-family: Courier, Arial;\"><a href=\"https:\/\/p5js.org\/es\/reference\/#\/p5\/preload\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: Courier, Arial;\">preload()<\/span><\/a><\/span> es fa servir per a carregar la imatge abans d\u2019executar el codi. De fet, si existeix aquesta funci\u00f3, la funci\u00f3 <span style=\"font-family: Courier, Arial;\">setup()<\/span> no s\u2019executar\u00e0 fins que la funci\u00f3 <span style=\"font-family: Courier, Arial;\">preload()<\/span> hagi finalitzat (i, per tant, que totes les imatges estiguin carregades).<\/p>\n<p>El resultat, si executem aquest programa, ser\u00e0 aquest:<\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-full wp-image-255\" src=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_003.jpg\" alt=\"\" width=\"483\" height=\"161\" srcset=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_003.jpg 483w, http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_003-300x100.jpg 300w\" sizes=\"(max-width: 483px) 100vw, 483px\" \/><\/p>\n<p>Podeu veure aquest exemple funcionant a <a href=\"http:\/\/cv.uoc.edu\/~ccasadom\/PDA\/r5e1.html\" target=\"_blank\" rel=\"noopener\">http:\/\/cv.uoc.edu\/~ccasadom\/PDA\/html<\/a>.<\/p>\n<p>Aquest exemple es correspon amb l\u2019exemple 7-1 del llibre (atenci\u00f3 al canvi que s\u2019ha fet al codi \u2013en color rosa\u2013 especificant el directori on hi ha la imatge emmagatzemada).<\/p>\n<p>Per a dibuixar la imatge, hem fet servir la funci\u00f3 <span style=\"font-family: Courier, Arial;\">image()<\/span> que t\u00e9 aquesta sintaxi:<\/p>\n<pre>image(img, x, y, [width], [height])\r\n\r\nimage(img, dx, dy, dWidth, dHeight, sx, sy, [sWidth], [sHeight])<\/pre>\n<p>La primera \u00e9s f\u00e0cil, <span style=\"font-family: Courier, Arial;\">x<\/span> i <span style=\"font-family: Courier, Arial;\">y<\/span> indiquen la posici\u00f3 del <em>canvas<\/em> on es posar\u00e0 la imatge (correspon amb la cantonada superior esquerra de la imatge) i <span style=\"font-family: Courier, Arial;\">width<\/span> i <span style=\"font-family: Courier, Arial;\">height<\/span> l\u2019amplada i l\u2019al\u00e7ada. Si no indiquem aquestes dues dades, aleshores far\u00e0 servir les mides originals.<\/p>\n<p>La segona \u00e9s m\u00e9s complexa, <span style=\"font-family: Courier, Arial;\">dx<\/span> i <span style=\"font-family: Courier, Arial;\">dy<\/span> indiquen la posici\u00f3 de la imatge al <em>canvas<\/em>, <span style=\"font-family: Courier, Arial;\">dWidth<\/span> i <span style=\"font-family: Courier, Arial;\">dHeight<\/span> la mida de la imatge al <em>canvas<\/em>, <span style=\"font-family: Courier, Arial;\">sx<\/span> i <span style=\"font-family: Courier, Arial;\">sy<\/span> a partir de quina posici\u00f3 mostrarem la imatge i <span style=\"font-family: Courier, Arial;\">sWitdth<\/span> i <span style=\"font-family: Courier, Arial;\">sHeight<\/span> la mida que agafarem de la imatge. Si <span style=\"font-family: Courier, Arial;\">sWitdth<\/span> i <span style=\"font-family: Courier, Arial;\">sHeight<\/span> s\u00f3n m\u00e9s petits que <span style=\"font-family: Courier, Arial;\">dWidth<\/span> i <span style=\"font-family: Courier, Arial;\">dHeight<\/span>, el tros d\u2019imatge que es mostri es far\u00e0 m\u00e9s gran i, en cas contrari, m\u00e9s petit.<\/p>\n<p>En l\u2019exemple 7-2 es fan dues coses. Per una banda, es carreguen dues imatges. Per l\u2019altra, a l\u2019hora de dibuixar-les es fan servir diferents efectes:<\/p>\n<pre>image(img1, -120, 0);<\/pre>\n<p>Aix\u00f2 fa que la imatge que es carrega ho faci 120 p\u00edxels fora del <em>canvas<\/em>. El resultat \u00e9s aquest:<\/p>\n<p><img loading=\"lazy\" class=\"alignnone size-full wp-image-256\" src=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_005.jpg\" alt=\"\" width=\"364\" height=\"165\" srcset=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_005.jpg 364w, http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_005-300x136.jpg 300w\" sizes=\"(max-width: 364px) 100vw, 364px\" \/><\/p>\n<p>Hem retallat la imatge per l\u2019esquerra.<\/p>\n<p>Ara afegim un altre cop la mateixa imatge, per\u00f2 canviant la posici\u00f3 <strong>x<\/strong> (130 p\u00edxels a la dreta) i retallant-la (ens quedem nom\u00e9s amb 240 p\u00edxels d\u2019amplada i 120 d\u2019al\u00e7ada).<\/p>\n<pre>image(img1, -120, 0);\r\nimage(img1, 130, 0, 240, 120);<\/pre>\n<p>Aquest \u00e9s el resultat:<\/p>\n<p><img loading=\"lazy\" class=\"alignnone wp-image-926 size-full\" src=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_007bis.jpg\" alt=\"\" width=\"392\" height=\"163\" srcset=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_007bis.jpg 392w, http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_007bis-300x125.jpg 300w\" sizes=\"(max-width: 392px) 100vw, 392px\" \/><\/p>\n<p>En el primer cas, com que no hem indicat la mida, ha intentat posar tota la imatge i ha sortit la part que cabia al <em>canvas<\/em>. En el segon cas, hem indicat la mida on s\u2019havia d\u2019encabir la imatge i <strong>la imatge s\u2019ha adaptat a la mida disponible<\/strong>.<\/p>\n<p>Ara afegim la segona imatge:<\/p>\n<pre>image(img1, -120, 0);\r\nimage(img1, 130, 0, 240, 120);\r\nimage(img2, 300, 0, 240, 120);<\/pre>\n<p>I aquest \u00e9s el resultat:<\/p>\n<p><img loading=\"lazy\" class=\"alignnone wp-image-927 size-full\" src=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_009bis.jpg\" alt=\"\" width=\"485\" height=\"165\" srcset=\"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_009bis.jpg 485w, http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-content\/uploads\/sites\/17\/2019\/07\/PID_00258586_4_009bis-300x102.jpg 300w\" sizes=\"(max-width: 485px) 100vw, 485px\" \/><\/p>\n<p>Fixeu-vos que les imatges es posen unes a sobre de les altres. La darrera a dibuixar-se \u00e9s la que estar\u00e0 m\u00e9s amunt.<\/p>\n<p>Podeu veure aquest exemple funcionant a <a href=\"http:\/\/cv.uoc.edu\/~ccasadom\/PDA\/r5e2.html\">http:\/\/cv.uoc.edu\/~ccasadom\/PDA\/r5e2.html<\/a>.<\/p>\n<p>En l\u2019exemple 7-3, la mida de la imatge varia segons el moviment del ratol\u00ed:<\/p>\n<pre>image(img, 0, 0, mouseX * 2, mouseY * 2);<\/pre>\n<p>En aquest exemple es pot veure com la imatge s\u2019adapta a la mida que hem donat a la funci\u00f3 <span style=\"font-family: Courier, Arial;\">image()<\/span>.<\/p>\n<p>Podeu veure aquest exemple a l\u2019adre\u00e7a <a href=\"http:\/\/cv.uoc.edu\/~ccasadom\/PDA\/r5e3.html\" target=\"_blank\" rel=\"noopener\">http:\/\/cv.uoc.edu\/~ccasadom\/PDA\/r5e3.html<\/a>.<\/p>\n<p>En els exemples 7-4 i 7-5, el que tenim s\u00f3n dues imatges, una en format <strong>gif<\/strong> i l\u2019altra en format <strong>png<\/strong>, que tenen transpar\u00e8ncia. El codi \u00e9s el mateix en els dos casos, l\u2019\u00fanica cosa que canvia \u00e9s la imatge. Podeu veure aquests dos exemples a les adreces seg\u00fcents:<\/p>\n<ul>\n<li><a href=\"http:\/\/cv.uoc.edu\/~ccasadom\/PDA\/r5e4.html\" target=\"_blank\" rel=\"noopener\">http:\/\/cv.uoc.edu\/~ccasadom\/PDA\/r5e4.html<\/a><\/li>\n<li><a href=\"http:\/\/cv.uoc.edu\/~ccasadom\/PDA\/r5e5.html\" target=\"_blank\" rel=\"noopener\">http:\/\/cv.uoc.edu\/~ccasadom\/PDA\/html<\/a><\/li>\n<\/ul>\n<p>Quan tenim imatges <strong>gif<\/strong> o <strong>png<\/strong> amb transpar\u00e8ncia, podem posar la imatge amb transpar\u00e8ncia a sobre de qualsevol dibuix (sia una altra imatge o un dibuix generat per nosaltres mitjan\u00e7ant codi) i als llocs on la imatge sigui transparent, es veur\u00e0 la imatge que tenim a sota.<\/p>\n<p>L\u2019exemple 7-6 carrega una imatge en format <strong>svg<\/strong>. Es pot veure funcionant a l&#8217;adre\u00e7a <a href=\"http:\/\/cv.uoc.edu\/~ccasadom\/PDA\/r5e6.html\" target=\"_blank\" rel=\"noopener\">http:\/\/cv.uoc.edu\/~ccasadom\/PDA\/r5e6.html<\/a>.<\/p>\n<p>Finalment, els exemples 7-7 i 7-8 estan fets per a explicar que cal carregar les imatges i esperar que es carreguin abans de mostrar-les. L\u2019exemple 7-7 \u00e9s una c\u00f2pia de l\u2019exemple 7-1, per\u00f2 en aquest cas no s\u2019espera la c\u00e0rrega de la imatge. En conseq\u00fc\u00e8ncia, la imatge no apareix en pantalla perqu\u00e8 s\u2019intenta pintar abans d\u2019estar carregada. Hi ha una petita \u00abtrampa\u00bb, ja que al <span style=\"font-family: Courier, Arial;\">setup()<\/span> es fa una crida a la funci\u00f3 <a href=\"https:\/\/p5js.org\/es\/reference\/#\/p5\/noLoop\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: Courier, Arial;\">noLoop()<\/span><\/a> per tal que la funci\u00f3 <span style=\"font-family: Courier, Arial;\">draw()<\/span> no es repeteixi, de manera que nom\u00e9s es far\u00e0 un cop. Compte, podria ser que ens interess\u00e9s un codi on <span style=\"font-family: Courier, Arial;\">draw()<\/span> no es repet\u00eds, per tant, no es pot considerar una trampa de veritat.<\/p>\n<p>Aquest exemple es pot veure funcionant a <a href=\"http:\/\/cv.uoc.edu\/~ccasadom\/PDA\/r5e7.html\" target=\"_blank\" rel=\"noopener\">http:\/\/cv.uoc.edu\/~ccasadom\/PDA\/r5e7.html<\/a>.<\/p>\n<p>L\u2019exemple 7-8 proposa una altra soluci\u00f3 a la q\u00fcesti\u00f3 de la c\u00e0rrega de la imatge. El que es fa \u00e9s afegir un nou par\u00e0metre a la funci\u00f3 <span style=\"font-family: Courier, Arial;\">loadImage()<\/span> on s\u2019indica quina funci\u00f3 caldr\u00e0 cridar un cop s\u2019hagi acabat la c\u00e0rrega de la imatge.<\/p>\n<p>Aquest exemple es pot veure funcionant a <a href=\"http:\/\/cv.uoc.edu\/~ccasadom\/PDA\/r5e8.html\" target=\"_blank\" rel=\"noopener\">http:\/\/cv.uoc.edu\/~ccasadom\/PDA\/r5e8.html<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fins ara hem creat dibuixos fets a partir de les formes que creem amb p5.js. Per\u00f2 amb p5.js podem importar imatges en format jpg o png i fer-les servir per a incloure-les als nostres programes, podent fer composicions m\u00e9s complexes. Per a poder treballar amb imatges necess\u00e0riament haurem de treballar en l\u00ednia, amb el servidor [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"inline_featured_image":false},"acf":[],"_links":{"self":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/pages\/891"}],"collection":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/comments?post=891"}],"version-history":[{"count":17,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/pages\/891\/revisions"}],"predecessor-version":[{"id":3990,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/pages\/891\/revisions\/3990"}],"wp:attachment":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/wp-json\/wp\/v2\/media?parent=891"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}