{"id":203,"date":"2012-12-17T10:05:45","date_gmt":"2012-12-17T08:05:45","guid":{"rendered":"http:\/\/www.joanillo.org\/?p=203"},"modified":"2020-09-15T10:06:48","modified_gmt":"2020-09-15T08:06:48","slug":"programant-amb-gimp-ii-pintar-pixels-a-la-pantalla","status":"publish","type":"post","link":"https:\/\/www.joanillo.org\/?p=203","title":{"rendered":"Programant amb GIMP II. Pintar pixels a 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 veritat \u00e9s que no hi ha molta informaci\u00f3 i exemples per programar plugins amb GIMP. Per\u00f2 el cert \u00e9s que la llibreria est\u00e0 ben documentada i s&#8217;ent\u00e9n for\u00e7a r\u00e0pid si un est\u00e0 familiaritzat amb la programaci\u00f3 d&#8217;altres APIs i els conceptes de GIMP (capes, 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 mode d&#8217;exemple anem a fer all\u00f2 que considerem m\u00e9s b\u00e0sic: pintar pixels individuals sobre la pantalla. De l&#8217;enlla\u00e7 anterior fem un rep\u00e0s a les diferents possibilitats que ens ofereix la llibreria i ens fixem en la seg\u00fcent 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>i aqu\u00ed tenim unes poques funcions, concretament la que necessitarem per pintar pixels \u00e9s<\/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 argument \u00e9s un punter a un objecte GimpPixelFetcher que hem inicialitzat pr\u00e8viament.<\/p>\n<blockquote><p>\\tGimpPixelFetcher *pf;<br \/>\n\\tpf = gimp_pixel_fetcher_new (drawable,FALSE);<\/p><\/blockquote>\n<p>S&#8217;inicialitza a partir del <em>drawable<\/em>, que representa la capa sobre la que volem pintar. Per tant aquest punter ens d\u00f3na un espai de mem\u00f2ria que podem associar a un pixel d&#8217;una capa.<\/p>\n<p>Els arguments x, y s\u00f3n evidenment les coordenades on volem escriure el pixel.<\/p>\n<p>Finalment el punter <em>*pixel<\/em> cont\u00e9 la informaci\u00f3 del pixel, concretament les 3 components del color.<\/p>\n<p>Seguidament mostrem la funci\u00f3 principal <em>pintar_pixel()<\/em> del nostre plugin, que el que fa \u00e9s pintar 5 pixels per pantalla, en les posicions (20,0),&#8230;, (24,0). El codi (<em>fitxer gimp_pixel_fetcher_put_pixel.c<\/em>) el pots descarregar a la <a href=\"http:\/\/wiki.joanillo.org\/index.php\/Programaci%C3%B3_GIMP#Escriure_pixels_per_la_pantalla\">wiki<\/a>, tot i que est\u00e0 una mica brut. El primer pixel tindr\u00e0 el mateix color que el <em>foreground<\/em> que tinc seleccionat en aquell moment; per al segon pixel estableixo un color amb la funci\u00f3 <em>gimp_rgb_set()<\/em>; el tercer pixel ser\u00e0 igual que el pixel de la posici\u00f3 (0,0), utilitzo la funci\u00f3 <em>gimp_pixel_fetcher_get_pixel()<\/em>; per als quart i cinqu\u00e8 pixel fico directament les coordenades <em>RGB<\/em> del color.<\/p>\n<p>Per compilar:<\/p>\n<blockquote><p>$ gimptool-2.0 &#8211;install gimp_pixel_fetcher_put_pixel.c<\/p><\/blockquote>\n<p>i el codi:<\/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. escric un pixel amb 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; \/\/vermell (0-255)<br \/>\n\\tpx[1] = 255*(&amp;color)-&gt;g; \/\/verd (0-255)<br \/>\n\\tpx[2] = 255*(&amp;color)-&gt;b; \/\/blau (0-255)<br \/>\n\\tgimp_pixel_fetcher_put_pixel (pf, x1+20, y1, px);<\/p>\n<p>\\t\/\/2. escric un pixel i dic quin color vull amb la funci\u00f3 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; \/\/vermell (0-255)<br \/>\n\\tpx[1] = 255*(&amp;color)-&gt;g; \/\/verd (0-255)<br \/>\n\\tpx[2] = 255*(&amp;color)-&gt;b; \/\/blau (0-255)<br \/>\n\\tgimp_pixel_fetcher_put_pixel (pf, x1+21, y1, px);<\/p>\n<p>\\t\/\/3. escric un pixel igual que el de la posici\u00f3 (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]); \/\/puc obtenir informaci\u00f3 del pixel (components RGB)<br \/>\n\\tgimp_pixel_fetcher_put_pixel (pf, x1+22, y1, px);<\/p>\n<p>\\t\/\/4. escric un pixel i dic quin color vull<br \/>\n\\tpx[0] = 255; \/\/vermell (0-255)<br \/>\n\\tpx[1] = 0; \/\/verd (0-255)<br \/>\n\\tpx[2] = 0; \/\/blau (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; \/\/vermell (0-255)<br \/>\n\\t*(px+1)=0; \/\/verd (0-255)<br \/>\n\\t*(px+2)=255; \/\/blau (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 veritat \u00e9s que no hi ha molta informaci\u00f3 i exemples per programar plugins amb GIMP. Per\u00f2 el cert \u00e9s que la llibreria est\u00e0 ben documentada i s&#8217;ent\u00e9n for\u00e7a r\u00e0pid si un est\u00e0 familiaritzat amb la programaci\u00f3 d&#8217;altres APIs i els conceptes de GIMP (capes, brushes,&#8230;). GIMP Library Reference Manual: http:\/\/developer.gimp.org\/api\/2.0\/libgimp\/ A mode d&#8217;exemple anem [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[16,20],"tags":[],"_links":{"self":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/203"}],"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=203"}],"version-history":[{"count":1,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/203\/revisions"}],"predecessor-version":[{"id":204,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/203\/revisions\/204"}],"wp:attachment":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=203"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=203"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=203"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}