{"id":436,"date":"2022-10-06T11:57:44","date_gmt":"2022-10-06T09:57:44","guid":{"rendered":"http:\/\/quadern-programacio.recursos.uoc.edu\/?page_id=436"},"modified":"2022-10-07T13:24:45","modified_gmt":"2022-10-07T11:24:45","slug":"8-3-imagenes","status":"publish","type":"page","link":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/8-3-imagenes\/","title":{"rendered":"8.3. Im\u00e1genes"},"content":{"rendered":"<p>Una vez que ya sabemos c\u00f3mo lidiar con archivos externos en P5, trabajar con im\u00e1genes nos resultar\u00e1 muy sencillo. Al igual que suced\u00eda con las tipograf\u00edas externas, podemos enlazar en nuestro <em>sketch<\/em> im\u00e1genes que tengamos en nuestro propio sistema.<\/p>\n<p>Para cargar im\u00e1genes desde nuestro propio sistema, debemos seguir el mismo proceso que al cargar fuentes. P5 acepta distintos formatos, entre los que encontramos los habituales JPG, PNG, GIF e incluso SVG. En el caso de las im\u00e1genes en PNG, GIF o SVG tambi\u00e9n podremos usar im\u00e1genes que tengan transparencia.<\/p>\n<p>Lo primero que debemos hacer es obtener la URL de la imagen que queramos utilizar de la misma manera que lo hicimos con la tipograf\u00eda. Una vez que la tengamos, la usaremos dentro del m\u00e9todo <span class=\"courier\">loadImage()<\/span> para cargarla en nuestro <em>sketch<\/em> y posteriormente utilizaremos <span class=\"courier\">image()<\/span> para dibujarla en el <em>canvas<\/em>. Con las im\u00e1genes nos enfrentamos al mismo problema que con las tipograf\u00edas o con cualquier otro archivo externo: al tener que ser descargadas por el navegador, debemos poner el c\u00f3digo que las descarga dentro de la funci\u00f3n <span class=\"courier\">preload()<\/span> para que el programa no se ejecute hasta que la imagen se haya descargado por completo.<\/p>\n<pre>let img;\r\n\r\nfunction preload() {\r\n  img = loadImage(\"\/filemanager\/source_repo\/ccasadom\/croissant.jpg\");\r\n}\r\n\r\nfunction setup() {\r\n  createCanvas(400, 400);\r\n}\r\n\r\nfunction draw() {\r\n  background(200);\r\n  image(img, 0, 0);\r\n}<\/pre>\n<p>Los par\u00e1metros que le pasamos a <span class=\"courier\">image()<\/span> son, en primer lugar, la imagen que hayamos cargado con <span class=\"courier\">loadImage()<\/span> y, a continuaci\u00f3n, las coordenadas <em>x<\/em> e <em>y<\/em> donde queramos dibujar la imagen. Esta coordenada ser\u00e1 la esquina superior izquierda de la imagen. Por defecto, el tama\u00f1o de la imagen ser\u00e1 su tama\u00f1o original.<\/p>\n<p>Si queremos redimensionar la imagen, podemos hacerlo a\u00f1adiendo otros dos par\u00e1metros para establecer el ancho y el alto con el que queremos que se muestre la imagen. Debemos tener en cuenta que de esta manera podemos alterar la ratio de aspecto de la imagen, estrech\u00e1ndola o alarg\u00e1ndola. Para evitar esto, podemos hacer uso de las propiedades <span class=\"courier\">width<\/span> y <span class=\"courier\">height<\/span>, que podemos extraer de cualquier imagen para conocer su anchura y altura y luego multiplicar estos valores por un \u00fanico valor para asegurarnos de que mantenemos sus proporciones originales.<\/p>\n<figure id=\"attachment_252\" aria-describedby=\"caption-attachment-252\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-252\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_106.jpg\" alt=\"\" width=\"800\" height=\"434\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_106.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_106-300x163.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_106-768x417.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-252\" class=\"wp-caption-text\">Figura 107. Redimensionando una imagen manteniendo sus proporciones<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<figure id=\"attachment_254\" aria-describedby=\"caption-attachment-254\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-254\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_107.jpg\" alt=\"\" width=\"800\" height=\"429\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_107.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_107-300x161.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_107-768x412.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-254\" class=\"wp-caption-text\">Figura 108. Cargando una imagen transparente desde nuestro sistema<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<h3>Atributos de las im\u00e1genes<\/h3>\n<p>Para cambiar el modo como se muestran las im\u00e1genes, podemos utilizar varios atributos. Podemos, como tambi\u00e9n puede hacerse con c\u00edrculos, arcos y rect\u00e1ngulos, cambiar el punto desde el que dibujamos la imagen usando <span class=\"courier\">imageMode()<\/span>, que acepta los par\u00e1metros <span class=\"courier\">CORNER<\/span> (el modo por defecto), <span class=\"courier\">CORNERS<\/span> y <span class=\"courier\">CENTER<\/span>.<\/p>\n<p>Tambi\u00e9n podemos cambiar el \u00abtinte\u00bb de la imagen con el m\u00e9todo <span class=\"courier\">tint()<\/span>, al que le pasamos como par\u00e1metro el color con el que queremos tintar la imagen. Este color puede tener transparencia, por lo que si queremos que nuestra imagen tenga transparencia, podemos usar un <span class=\"courier\">tint()<\/span> con blanco y el <em>alpha<\/em> que queramos. Para volver a los valores por defecto, podemos utilizar <span class=\"courier\">noTint()<\/span>.<\/p>\n<figure id=\"attachment_256\" aria-describedby=\"caption-attachment-256\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-256\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_108.jpg\" alt=\"\" width=\"800\" height=\"374\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_108.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_108-300x140.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_108-768x359.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-256\" class=\"wp-caption-text\">Figura 109. Usando diferentes valores de <span class=\"courier\">tint()<\/span><br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<h3>Filtros<\/h3>\n<p>P5 tambi\u00e9n nos ofrece una serie de filtros que podemos aplicar a nuestro <em>canvas<\/em> mediante el m\u00e9todo <span class=\"courier\">filter()<\/span>, que acepta como primer par\u00e1metro el filtro que queremos aplicar y en funci\u00f3n de cu\u00e1l elijamos podremos a\u00f1adir un segundo par\u00e1metro para controlar el efecto. Las opciones de filtros que tenemos son: <span class=\"courier\">THRESHOLD<\/span>, <span class=\"courier\">GRAY<\/span>, <span class=\"courier\">OPAQUE<\/span>, <span class=\"courier\">INVERT<\/span>, <span class=\"courier\">POSTERIZE<\/span>, <span class=\"courier\">BLUR<\/span>, <span class=\"courier\">ERODE<\/span> y <span class=\"courier\">DILATE<\/span>. En la referencia de <a href=\"https:\/\/p5js.org\/reference\/#\/p5\/filter\" target=\"_blank\" rel=\"noopener\"><span class=\"courier\">filter()<\/span><\/a> se puede encontrar qu\u00e9 hace cada uno de los filtros y si tiene un par\u00e1metro opcional para controlarlo. Algunos de estos filtros suponen una considerable carga de computaci\u00f3n para ejecutarse en tiempo real, por lo que es aconsejable que los usemos con moderaci\u00f3n. En muchas ocasiones, podremos procesar la imagen en alg\u00fan software de retoque fotogr\u00e1fico antes de subirla a nuestro <em>sketch<\/em> para alcanzar el resultado deseado. Tambi\u00e9n debemos tener en cuenta que estos filtros se aplican a todo el <em>canvas<\/em>, no solo a la imagen en s\u00ed.<\/p>\n<figure id=\"attachment_258\" aria-describedby=\"caption-attachment-258\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-258\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_109.jpg\" alt=\"\" width=\"800\" height=\"365\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_109.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_109-300x137.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_109-768x350.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-258\" class=\"wp-caption-text\">Figura 110. Usando <span class=\"courier\">filter()<\/span><br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<h3>Modos de fusi\u00f3n<\/h3>\n<p>En P5 tambi\u00e9n encontramos diferentes modos de fusi\u00f3n para nuestro <em>canvas<\/em>, que funcionan de manera muy similar a los modos de fusi\u00f3n que podemos aplicar a las capas de softwares como Photoshop o Gimp. Para cambiar el modo de fusi\u00f3n utilizaremos el m\u00e9todo <span class=\"courier\">blendMode()<\/span>, que acepta como par\u00e1metro las siguientes opciones: <span class=\"courier\">BLEND<\/span> (por defecto), <span class=\"courier\">ADD<\/span>, <span class=\"courier\">DARKEST<\/span>, <span class=\"courier\">LIGHTEST<\/span>, <span class=\"courier\">DIFFERENCE<\/span>, <span class=\"courier\">EXCLUSION<\/span>, <span class=\"courier\">MULTIPLY<\/span>, <span class=\"courier\">SCREEN<\/span>, <span class=\"courier\">REPLACE<\/span>, <span class=\"courier\">REMOVE<\/span>, <span class=\"courier\">OVERLAY<\/span>, <span class=\"courier\">HARD_LIGHT<\/span>, <span class=\"courier\">SOFT_LIGHT<\/span>, <span class=\"courier\">DODGE<\/span>, <span class=\"courier\">BURN<\/span> y <span class=\"courier\">SUBTRACT<\/span>. Todos funcionan de la misma manera que sus hom\u00f3nimos en otros softwares. Del mismo modo que los filtros, se aplican a todo el <em>canvas<\/em>.<\/p>\n<figure id=\"attachment_260\" aria-describedby=\"caption-attachment-260\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-260\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_110.jpg\" alt=\"\" width=\"800\" height=\"372\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_110.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_110-300x140.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_110-768x357.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-260\" class=\"wp-caption-text\">Figura 111. Cambiando el modo de fusi\u00f3n<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<h3>Informaci\u00f3n de color<\/h3>\n<p>Las im\u00e1genes que cargamos en nuestros <em>sketches<\/em> pueden servirnos para otros prop\u00f3sitos distintos al de simplemente dibujarlas en nuestro <em>canvas<\/em>. Tambi\u00e9n nos pueden servir para extraer su informaci\u00f3n de color y utilizarla de manera creativa. El m\u00e9todo <span class=\"courier\">get()<\/span> aplicado a cualquier imagen nos permite establecer qu\u00e9 color tiene la imagen en las coordenadas (<em>x<\/em>, <em>y<\/em>) que le pasemos como par\u00e1metro.<\/p>\n<p><figure id=\"attachment_262\" aria-describedby=\"caption-attachment-262\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-262\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_111.jpg\" alt=\"\" width=\"800\" height=\"369\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_111.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_111-300x138.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_111-768x354.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-262\" class=\"wp-caption-text\">Figura 112. Extrayendo informaci\u00f3n de color con <span class=\"courier\">get()<\/span><br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>En la figura 112 cargamos una imagen y en el <span class=\"courier\">draw()<\/span> utilizamos <span class=\"courier\">get()<\/span> para extraer la informaci\u00f3n de color de esta en la posici\u00f3n actual del rat\u00f3n, con el fin de utilizarla como relleno de un c\u00edrculo que dibujamos en el centro de la pantalla.<\/p>\n<p>No es necesario que dibujemos la imagen, con cargarla en el <em>sketch<\/em> es suficiente. Veamos un par de ejemplos en los que hacemos uso de esta informaci\u00f3n de manera creativa incorporando conceptos que ya hemos visto anteriormente en la asignatura: bucles <span class=\"courier\">for<\/span>, aleatoriedad e interacci\u00f3n.<\/p>\n<p>Utilizando bucles podr\u00edamos crear nuestro propio efecto para \u00abpixelar\u00bb una imagen. Primero, deberemos crear un par de bucles anidados que recorran el <em>canvas<\/em> en horizontal y vertical. A continuaci\u00f3n, en cada paso del bucle extraemos la informaci\u00f3n de color del punto concreto en el que nos encontremos y, por \u00faltimo, utilizamos esta informaci\u00f3n de color para dibujar un cuadrado relleno del color presente en esa coordenada.<\/p>\n<figure id=\"attachment_264\" aria-describedby=\"caption-attachment-264\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-264\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_112.jpg\" alt=\"\" width=\"800\" height=\"369\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_112.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_112-300x138.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_112-768x354.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-264\" class=\"wp-caption-text\">Figura 113. \u00abPixelando\u00bb una imagen<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<p>En el ejemplo de la figura 113 tambi\u00e9n se ha a\u00f1adido un elemento interactivo: el desplazamiento en <em>x<\/em> e <em>y<\/em> en cada paso del bucle y el tama\u00f1o del cuadrado que dibujamos viene determinado por la posici\u00f3n en el eje <em>x<\/em> del rat\u00f3n. De esta manera, creamos un efecto interactivo en el que los p\u00edxeles ser\u00e1n mayores o menores seg\u00fan la posici\u00f3n de nuestro rat\u00f3n.<\/p>\n<p>Veamos otro ejemplo del uso de la informaci\u00f3n de color, pero esta vez usando aleatoriedad.<\/p>\n<figure id=\"attachment_266\" aria-describedby=\"caption-attachment-266\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-266\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_113.jpg\" alt=\"\" width=\"800\" height=\"371\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_113.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_113-300x139.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_113-768x356.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-266\" class=\"wp-caption-text\">Figura 114. Efecto puntillista<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<p>En este ejemplo hemos cargado una imagen y en cada <em>frame<\/em> estamos eligiendo un punto al azar de la imagen para extraer la informaci\u00f3n de color y dibujar un c\u00edrculo en esa posici\u00f3n con el fin de crear un efecto puntillista. Para darle mayor organicidad al proceso de dibujado, se ha establecido un tama\u00f1o aleatorio de cada c\u00edrculo. Seg\u00fan vaya pasando el tiempo y se vayan acumulando los c\u00edrculos, la imagen se ir\u00e1 conformando.<\/p>\n<p>Siguiendo en la l\u00ednea del efecto puntillista, podr\u00edamos crear un \u00abpincel\u00bb que nos permitiera ir revelando la imagen seg\u00fan el movimiento del rat\u00f3n:<\/p>\n<figure id=\"attachment_268\" aria-describedby=\"caption-attachment-268\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-268\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_114.jpg\" alt=\"\" width=\"800\" height=\"377\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_114.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_114-300x141.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_114-768x362.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-268\" class=\"wp-caption-text\">Figura 115. Pincel aleatorio<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<p>En esta ocasi\u00f3n lo que hacemos es que en cada <em>frame<\/em> creamos, a trav\u00e9s de un bucle <span class=\"courier\">for<\/span>, cinco c\u00edrculos en posiciones aleatorias cercanas a la posici\u00f3n de nuestro rat\u00f3n (utilizando <span class=\"courier\">mouseX<\/span> y <span class=\"courier\">mouseY<\/span> a los que sumamos un valor aleatorio que en este caso tiene un rango que va de \u201320 a 20). A continuaci\u00f3n, extraemos la informaci\u00f3n de color de esos cinco puntos y dibujamos c\u00edrculos de tama\u00f1os aleatorios en esas coordenadas.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una vez que ya sabemos c\u00f3mo lidiar con archivos externos en P5, trabajar con im\u00e1genes nos resultar\u00e1 muy sencillo. Al igual que suced\u00eda con las tipograf\u00edas externas, podemos enlazar en nuestro sketch im\u00e1genes que tengamos en nuestro propio sistema. Para cargar im\u00e1genes desde nuestro propio sistema, debemos seguir el mismo proceso que al cargar fuentes. [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"acf":[],"_links":{"self":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/436"}],"collection":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/comments?post=436"}],"version-history":[{"count":2,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/436\/revisions"}],"predecessor-version":[{"id":567,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/436\/revisions\/567"}],"wp:attachment":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/media?parent=436"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}