{"id":2004,"date":"2019-07-10T16:48:59","date_gmt":"2019-07-10T14:48:59","guid":{"rendered":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/?page_id=2004"},"modified":"2019-08-17T21:58:22","modified_gmt":"2019-08-17T19:58:22","slug":"4-2-importar-imagenes","status":"publish","type":"page","link":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/4-2-importar-imagenes\/","title":{"rendered":"4.2. Importar im\u00e1genes"},"content":{"rendered":"<p>Hasta ahora, hemos creado dibujos hechos a partir de las formas que creamos con p5.js. Pero con p5.js podemos importar im\u00e1genes en formato <strong>jpg<\/strong> o <strong>png<\/strong> y usarlas para incluirlas en nuestros programas, pudiendo hacer composiciones m\u00e1s complejas.<\/p>\n<p>Para poder trabajar con im\u00e1genes necesariamente tendremos que trabajar en l\u00ednea, con el servidor FTP de la UOC, dado que por seguridad los navegadores no permiten la carga de archivos de manera local.<\/p>\n<p>Para ello, crearemos una carpeta nueva a la que llamaremos <strong>img<\/strong>, donde guardaremos las im\u00e1genes que usemos.<\/p>\n<h2>Organizando el espacio del servidor<\/h2>\n<p>Vamos a ver cu\u00e1l ser\u00e1 la estructura que tenemos que tener en el 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>Dentro de la carpeta <strong>js<\/strong> tendremos los dos archivos que ya ten\u00edamos, el <strong>p5.min.js<\/strong> y el <strong>sketch.js<\/strong>.<\/p>\n<p>Dentro de la carpeta <strong>img<\/strong> guardaremos las im\u00e1genes que vienen como ejemplo en el libro, disponibles para bajarla desde\u00a0<a href=\"http:\/\/p5js.org\/learn\/books\/media.zip\" target=\"_blank\" rel=\"noopener\">http:\/\/p5js.org\/learn\/books\/media.zip<\/a>.<\/p>\n<p>Para poder usar una imagen, tendremos que hacer tres pasos previos:<\/p>\n<ol>\n<li>Copiar la imagen en la carpeta donde tenemos nuestro c\u00f3digo.<\/li>\n<li>Crear una variable que almacene la imagen.<\/li>\n<li>Cargar la imagen con la funci\u00f3n\u00a0<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>\u00bfC\u00f3mo hacemos estos tres pasos?<\/strong><\/p>\n<p>El primer paso ya lo hemos hecho. Para tener nuestros ficheros muy organizados, hemos almacenado las im\u00e1genes en una carpeta que se llama <strong>img<\/strong>, pero veremos que no influye a la hora de hacer nuestros programas.<\/p>\n<p>El segundo y tercer pasos los veremos en este ejemplo:<\/p>\n<pre>var img;   \/\/ Definimos una variable para almacenar la imagen\r\nfunction preload() {   \/\/ A\u00f1adimos una nueva funci\u00f3n que nos \r\n                       \/\/ carga la imagen\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); \/\/ Dibuja la imagen\r\n}\r\n<\/pre>\n<p>La funci\u00f3n\u00a0<span style=\"font-family: Courier, Arial;\"><a href=\"https:\/\/p5js.org\/es\/reference\/#\/p5\/preload\" target=\"_blank\" rel=\"noopener\">preload()<\/a><\/span> se usa para cargar la imagen antes de ejecutar el c\u00f3digo. De hecho, si existe esta funci\u00f3n, la funci\u00f3n <span style=\"font-family: Courier, Arial;\">setup()<\/span>\u00a0esperar\u00e1 a ejecutarse a que la funci\u00f3n <span style=\"font-family: Courier, Arial;\">preload()<\/span>\u00a0haya finalizado (y por lo tanto, a que todas las im\u00e1genes est\u00e9n cargadas).<\/p>\n<p>El resultado, si ejecutamos este programa, ser\u00e1 este:<\/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>Pod\u00e9is ver este ejemplo funcionando en\u00a0<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>Este ejemplo se corresponde con el ejemplo 7-1 del libro (atenci\u00f3n al cambio que se ha hecho en el c\u00f3digo \u2013en color rosa\u2013 especificando el directorio donde est\u00e1 la imagen almacenada).<\/p>\n<p>Para dibujar la imagen hemos usado la funci\u00f3n\u00a0<span style=\"font-family: Courier, Arial;\">image()<\/span> que tiene esta sintaxis:<\/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 es f\u00e1cil; <span style=\"font-family: Courier, Arial;\">x<\/span> e <span style=\"font-family: Courier, Arial;\">y<\/span> indican la posici\u00f3n del <em>canvas<\/em> donde se pondr\u00e1 la imagen (corresponde con la esquina superior izquierda de la imagen) y <span style=\"font-family: Courier, Arial;\">width<\/span> y <span style=\"font-family: Courier, Arial;\">height<\/span> el ancho y la altura. Si no indicamos estos dos datos, entonces usar\u00e1 las medidas originales.<\/p>\n<p>La segunda es m\u00e1s compleja; <span style=\"font-family: Courier, Arial;\">dx<\/span> y <span style=\"font-family: Courier, Arial;\">dy<\/span> indican la posici\u00f3n de la imagen en el <em>canvas<\/em>, <span style=\"font-family: Courier, Arial;\">dWidth<\/span> y <span style=\"font-family: Courier, Arial;\">dHeight<\/span>, el tama\u00f1o de la imagen en el <em>canvas<\/em>, <span style=\"font-family: Courier, Arial;\">sx<\/span> y <span style=\"font-family: Courier, Arial;\">sy<\/span> a partir de qu\u00e9 posici\u00f3n de la imagen mostraremos y <span style=\"font-family: Courier, Arial;\">sWitdth<\/span> y <span style=\"font-family: Courier, Arial;\">sHeight<\/span> el tama\u00f1o que cogeremos de la imagen. Si <span style=\"font-family: Courier, Arial;\">sWitdth<\/span> y <span style=\"font-family: Courier, Arial;\">sHeight<\/span> son m\u00e1s peque\u00f1os que <span style=\"font-family: Courier, Arial;\">dWidth<\/span> y <span style=\"font-family: Courier, Arial;\">dHeight<\/span> el trozo de imagen que se muestre se har\u00e1 m\u00e1s grande y, en caso contrario, m\u00e1s peque\u00f1o.<\/p>\n<p>En el ejemplo 7-2 se hacen dos cosas. Por un lado, se cargan dos im\u00e1genes. Por otra, a la hora de dibujarlas se usan diferentes efectos:<\/p>\n<pre>image(img1, -120, 0);<\/pre>\n<p>Esto hace que la imagen que se carga lo haga 120 p\u00edxeles fuera del <em>canvas<\/em>. El resultado es este:<\/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>Hemos recortado la imagen por la izquierda.<\/p>\n<p>Ahora a\u00f1adimos otra vez la misma imagen, pero cambiando la posici\u00f3n <strong>x<\/strong> (130 p\u00edxeles a la derecha) y recort\u00e1ndola (nos quedamos solo con 240 p\u00edxeles de anchura y 120 de altura).<\/p>\n<pre>image(img1, -120, 0);\r\nimage(img1, 130, 0, 240, 120);<\/pre>\n<p>Este es el resultado:<\/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 caso, como no hemos indicado el tama\u00f1o, ha intentado poner toda la imagen. Y ha salido la parte que cab\u00eda en el <em>canvas<\/em>. En el segundo caso, hemos indicado el tama\u00f1o donde se ten\u00eda que encajar la imagen y la imagen <strong>se ha adaptado a la medida disponible<\/strong>.<\/p>\n<p>Ahora a\u00f1adimos la segunda imagen:<\/p>\n<pre>image(img1, -120, 0);\r\nimage(img1, 130, 0, 240, 120);\r\nimage(img2, 300, 0, 240, 120);<\/pre>\n<p>Y este es el resultado:<\/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>Fijaos en que las im\u00e1genes se ponen encima unas de otras. La \u00faltima en dibujarse es la que estar\u00e1 m\u00e1s arriba.<\/p>\n<p>Pod\u00e9is ver este ejemplo funcionando en\u00a0<a href=\"http:\/\/cv.uoc.edu\/~ccasadom\/PDA\/r5e2.html\" target=\"_blank\" rel=\"noopener\">http:\/\/cv.uoc.edu\/~ccasadom\/PDA\/r5e2.html<\/a>.<\/p>\n<p>En el ejemplo 7-3 el tama\u00f1o de la imagen var\u00eda seg\u00fan el movimiento del rat\u00f3n:<\/p>\n<pre>image(img, 0, 0, mouseX * 2, mouseY * 2);<\/pre>\n<p>En este ejemplo se puede ver c\u00f3mo la imagen se adapta al tama\u00f1o que hemos dado a la funci\u00f3n <span style=\"font-family: Courier, Arial;\">image()<\/span>.<\/p>\n<p>Pod\u00e9is ver este ejemplo en la direcci\u00f3n\u00a0<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 los ejemplos 7-4 y 7-5 lo que tenemos son dos im\u00e1genes, una en formato <strong>gif<\/strong> y la otra en formato <strong>png<\/strong>, que tienen transparencia. El c\u00f3digo es el mismo en los dos casos, lo \u00fanico que cambia es la imagen. Pod\u00e9is ver estos dos ejemplos en las siguientes direcciones:<\/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>Cuando tenemos im\u00e1genes <strong>gif<\/strong> o <strong>png<\/strong> con transparencia, podemos poner la imagen con transparencia por encima de cualquier dibujo (sea otra imagen, sea un dibujo generado por nosotros mediante c\u00f3digo) y en los lugares donde la imagen sea transparente, se ver\u00e1 la imagen que tenemos por debajo.<\/p>\n<p>El ejemplo 7-6 carga una imagen en formato <strong>svg<\/strong>. Se puede ver funcionando en esta direcci\u00f3n\u00a0<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>Finalmente, los ejemplos 7-7 y 7-8 est\u00e1n hechos para explicar que hay que cargar las im\u00e1genes y esperar que carguen antes de mostrarlas. El ejemplo 7-7 es una copia del ejemplo 7-1, pero en este caso no se espera la carga de la imagen. En consecuencia, la imagen no aparece en pantalla porque se intenta pintar antes de estar cargada. Hay una peque\u00f1a \u00abtrampa\u00bb, pues en el <span style=\"font-family: Courier, Arial;\">setup()<\/span> se llama a la funci\u00f3n\u00a0<a href=\"https:\/\/p5js.org\/es\/reference\/#\/p5\/noLoop\" target=\"_blank\" rel=\"noopener\"><span style=\"font-family: Courier, Arial;\">noLoop()<\/span><\/a> para que la funci\u00f3n <span style=\"font-family: Courier, Arial;\">draw()<\/span> no se repita, con lo cual solo se har\u00e1 una vez. Cuidado, podr\u00eda ser que nos interesara un c\u00f3digo donde <span style=\"font-family: Courier, Arial;\">draw()<\/span> no se repitiera; por lo tanto, no se puede considerar una trampa de verdad.<\/p>\n<p>Este ejemplo se puede ver funcionando en\u00a0<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>El ejemplo 7-8 propone otra soluci\u00f3n a la cuesti\u00f3n de la carga de la imagen. Lo que se hace es a\u00f1adir un nuevo par\u00e1metro a la funci\u00f3n <span style=\"font-family: Courier, Arial;\">loadImage()<\/span> donde se indica a qu\u00e9 funci\u00f3n habr\u00e1 que llamar una vez se haya acabado la carga de la imagen.<\/p>\n<p>Este ejemplo se puede ver funcionando en\u00a0<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>Hasta ahora, hemos creado dibujos hechos a partir de las formas que creamos con p5.js. Pero con p5.js podemos importar im\u00e1genes en formato jpg o png y usarlas para incluirlas en nuestros programas, pudiendo hacer composiciones m\u00e1s complejas. Para poder trabajar con im\u00e1genes necesariamente tendremos que trabajar en l\u00ednea, con el servidor FTP de la [&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\/es\/wp-json\/wp\/v2\/pages\/2004"}],"collection":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/comments?post=2004"}],"version-history":[{"count":18,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/pages\/2004\/revisions"}],"predecessor-version":[{"id":2552,"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/pages\/2004\/revisions\/2552"}],"wp:attachment":[{"href":"http:\/\/disseny-test.uoc.edu\/materials\/programacio\/es\/wp-json\/wp\/v2\/media?parent=2004"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}