{"id":205,"date":"2012-12-17T10:06:53","date_gmt":"2012-12-17T08:06:53","guid":{"rendered":"http:\/\/www.joanillo.org\/?p=205"},"modified":"2020-09-16T12:41:18","modified_gmt":"2020-09-16T10:41:18","slug":"programando-con-gimp-ii-pintar-pixels-en-la-pantalla","status":"publish","type":"post","link":"https:\/\/www.joanillo.org\/?p=205&lang=es","title":{"rendered":"Programando con GIMP II. Pintar pixels en la pantalla"},"content":{"rendered":"<p><a href=\"http:\/\/www.joanillo.org\/wp-content\/uploads\/2012\/12\/put_pixel1.jpg\"><img loading=\"lazy\" src=\"http:\/\/www.joanillo.org\/wp-content\/uploads\/2012\/12\/put_pixel1-300x166.jpg\" alt=\"\" title=\"put_pixel\" width=\"300\" height=\"166\" class=\"alignright size-medium wp-image-711\"><\/a>La verdad es que no hay mucha informaci\u00f3n y ejemplos para programar plugins con GIMP. Pero lo cierto es que la librer\u00eda est\u00e1 bien documentada y se entiende bastante r\u00e1pido si uno est\u00e1 familiarizado con la programaci\u00f3n de otras APIs y con los conceptos de GIMP (capas, brushes,&#8230;).<\/p>\n<p><strong>GIMP Library Reference Manual<\/strong>:<\/p>\n<ul>\n<li><a href=\"http:\/\/developer.gimp.org\/api\/2.0\/libgimp\/\">http:\/\/developer.gimp.org\/api\/2.0\/libgimp\/<\/a><\/li>\n<\/ul>\n<p>A modo de ejemplo vamos a hacer lo que consideramos m\u00e1s b\u00e1sico: pintar pixels individuales sobre la pantalla. Del anterior enlace haremos un repaso a las diferentes posibilidades que nos ofrece la librer\u00eda y nos fijamos en la siguiente entrada:<\/p>\n<p><strong>gimppixelfetcher \u2014 Functions for operating on pixel regions<\/strong>:<\/p>\n<ul>\n<li><a href=\"http:\/\/developer.gimp.org\/api\/2.0\/libgimp\/libgimp-gimppixelfetcher.html\">http:\/\/developer.gimp.org\/api\/2.0\/libgimp\/libgimp-gimppixelfetcher.html<\/a><\/li>\n<\/ul>\n<p>y aqu\u00ed tenemos unas pocas funciones, concretamente la que necesitaremos para pintar pixels es<\/p>\n<blockquote><p>void                gimp_pixel_fetcher_put_pixel        (GimpPixelFetcher *pf,<br \/>\ngint x,<br \/>\ngint y,<br \/>\nconst guchar *pixel);<\/p><\/blockquote>\n<p>el primer argumento es un puntero a un objeto <em>GimpPixelFetcher<\/em> que hemos inicializado previamente.<\/p>\n<blockquote><p>\\tGimpPixelFetcher *pf;<br \/>\n\\tpf = gimp_pixel_fetcher_new (drawable,FALSE);<\/p><\/blockquote>\n<p>Se inicializa a partir del <em>drawable<\/em>, que representa la capa sobre la que queremos pintar. Por tanto este puntero nos da un espacio de memoria que podem asociar a un pixel de una capa.<\/p>\n<p>Los argumentos x, y son evidenmente las coordenadas donde queremos escribir el pixel.<\/p>\n<p>Finalmente el puntero <em>*pixel<\/em> contiene la informaci\u00f3n del pixel, concretamente los 3 componentes del color.<\/p>\n<p>Seguidamente mostramos la funci\u00f3n principal <em>pintar_pixel()<\/em> de nuestro plugin, que lo que hace es pintar 5 pixels por pantalla, en las posiciones (20,0),&#8230;, (24,0). El c\u00f3digo (<em>fitxer gimp_pixel_fetcher_put_pixel.c<\/em>) lo puedes descargar de la <a href=\"http:\/\/wiki.joanillo.org\/index.php\/Programaci%C3%B3_GIMP#Escriure_pixels_per_la_pantalla\">wiki<\/a>, aunque est\u00e1 un poco sucio. El primer pixel tendr\u00e1 el mismo color que el <em>foreground<\/em> que tengo seleccionado en ese momento; para el segundo pixel establezco un color con la funci\u00f3n <em>gimp_rgb_set()<\/em>; el tercer pixel ser\u00e1 igual que el pixel de la posici\u00f3n (0,0), utilizo la funci\u00f3n <em>gimp_pixel_fetcher_get_pixel()<\/em>; para los cuarto y quinto pixel pongo directamente las coordenadas <em>RGB<\/em> del color.<\/p>\n<p>Para compilar:<\/p>\n<blockquote><p>$ gimptool-2.0 &#8211;install gimp_pixel_fetcher_put_pixel.c<\/p><\/blockquote>\n<p>y el c\u00f3digo:<\/p>\n<blockquote><p>static void pintar_pixel (GimpDrawable *drawable)<br \/>\n{<br \/>\n\\tGimpPixelFetcher *pf;<br \/>\n\\tgint x1, y1;<br \/>\n\\tguchar *px; \/\/pixel is an array of bpp bytes.<br \/>\n\\tGimpRGB color;<\/p>\n<p>\\tx1=0;<br \/>\n\\ty1=0;<\/p>\n<p>\\tpf = gimp_pixel_fetcher_new (drawable,FALSE);<br \/>\n\\tpx = g_new (guchar, 1);<\/p>\n<p>\\t\/\/1. escribo un pixel con el color del foreground<br \/>\n\\tgimp_context_get_foreground (&amp;color);<br \/>\n\\t\/\/g_message (&#8220;%d,%d,%d&#8221;,(int)(&amp;color)-&gt;r,(int)(&amp;color)-&gt;g,(int)(&amp;color)-&gt;b);<br \/>\n\\tpx[0] = 255*(&amp;color)-&gt;r; \/\/rojo (0-255)<br \/>\n\\tpx[1] = 255*(&amp;color)-&gt;g; \/\/verde (0-255)<br \/>\n\\tpx[2] = 255*(&amp;color)-&gt;b; \/\/azul (0-255)<br \/>\n\\tgimp_pixel_fetcher_put_pixel (pf, x1+20, y1, px);<\/p>\n<p>\\t\/\/2. escribo un pixel y digo qu\u00e9 color quiero con la funci\u00f3n gimp_rgb_set<br \/>\n\\tgimp_rgb_set (&amp;color, 0.0, 1.0, 1.0);<br \/>\n\\tpx[0] = 255*(&amp;color)-&gt;r; \/\/rojo (0-255)<br \/>\n\\tpx[1] = 255*(&amp;color)-&gt;g; \/\/verde (0-255)<br \/>\n\\tpx[2] = 255*(&amp;color)-&gt;b; \/\/azul (0-255)<br \/>\n\\tgimp_pixel_fetcher_put_pixel (pf, x1+21, y1, px);<\/p>\n<p>\\t\/\/3. escribo un pixel igual que el de la posici\u00f3n (0,0)<br \/>\n\\tgimp_pixel_fetcher_get_pixel (pf,x1, y1, px);<br \/>\n\\t\/\/g_message (&#8220;%d,%d,%d&#8221;,(int)px[0],(int)px[1],(int)px[2]); \/\/puedo obtener informaci\u00f3n del pixel (componentes RGB)<br \/>\n\\tgimp_pixel_fetcher_put_pixel (pf, x1+22, y1, px);<\/p>\n<p>\\t\/\/4. escribo un pixel y digo qu\u00e9 color quiero<br \/>\n\\tpx[0] = 255; \/\/rojo (0-255)<br \/>\n\\tpx[1] = 0; \/\/verde (0-255)<br \/>\n\\tpx[2] = 0; \/\/azul (0-255)<br \/>\n\\tgimp_pixel_fetcher_put_pixel (pf, x1+23, y1, px);<br \/>\n\\t\/\/ o b\u00e9<br \/>\n\\t*px=0; \/\/rojo (0-255)<br \/>\n\\t*(px+1)=0; \/\/verde (0-255)<br \/>\n\\t*(px+2)=255; \/\/azul (0-255)<br \/>\n\\tgimp_pixel_fetcher_put_pixel (pf, x1+24, y1, px);<\/p>\n<p>\\tg_free (px);<\/p>\n<p>\\tgimp_pixel_fetcher_destroy (pf);<\/p>\n<p>\\tgimp_drawable_flush (drawable);<br \/>\n\\tgimp_drawable_merge_shadow (drawable-&gt;drawable_id, TRUE);<br \/>\n\\tgimp_drawable_update (drawable-&gt;drawable_id,20,0,5,1);<\/p>\n<p>}<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>La verdad es que no hay mucha informaci\u00f3n y ejemplos para programar plugins con GIMP. Pero lo cierto es que la librer\u00eda est\u00e1 bien documentada y se entiende bastante r\u00e1pido si uno est\u00e1 familiarizado con la programaci\u00f3n de otras APIs y con los conceptos de GIMP (capas, brushes,&#8230;). GIMP Library Reference Manual: http:\/\/developer.gimp.org\/api\/2.0\/libgimp\/ A modo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[324,194],"tags":[],"_links":{"self":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/205"}],"collection":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=205"}],"version-history":[{"count":1,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/205\/revisions"}],"predecessor-version":[{"id":206,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/205\/revisions\/206"}],"wp:attachment":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=205"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=205"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=205"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}