{"id":199,"date":"2012-12-14T10:03:24","date_gmt":"2012-12-14T08:03:24","guid":{"rendered":"http:\/\/www.joanillo.org\/?p=199"},"modified":"2020-09-15T10:04:33","modified_gmt":"2020-09-15T08:04:33","slug":"programant-amb-gimp-i-executar-plugins-des-de-la-consola","status":"publish","type":"post","link":"https:\/\/www.joanillo.org\/?p=199","title":{"rendered":"Programant amb GIMP I. Executar plugins des de la consola"},"content":{"rendered":"<p><a href=\"http:\/\/www.joanillo.org\/wp-content\/uploads\/2012\/12\/blur.jpg\"><img loading=\"lazy\" src=\"http:\/\/www.joanillo.org\/wp-content\/uploads\/2012\/12\/blur-300x232.jpg\" alt=\"\" title=\"blur\" width=\"300\" height=\"232\" class=\"alignright size-medium wp-image-699\"><\/a>Amb aquest article vull encetar una s\u00e8rie de posts sobre la programaci\u00f3 amb <strong>GIMP<\/strong>. No \u00e9s un tutorial per aprendre a programar GIMP, tan sols \u00e9s posar en ordre unes quantes idees enfocades a un futur projecte, que b\u00e0sicament \u00e9s desenvolupar un framework per poder explicar hist\u00f2ries tot dibuixant sobre la pantalla amb una <em>wacom<\/em>, i on es succeeixin m\u00faltiples efectes visuals i sonors. Si aquesta s\u00e8rie de posts s&#8217;acaba, en l&#8217;\u00faltim podrem veure com es toca una melodia on el pentagrama est\u00e0 dibuixat sobre el GIMP i les notes les dibuixo amb el ratol\u00ed o la wacom.<\/p>\n<p>Primer de tot necessitem les llibreries de desenvolupament del GIMP:<\/p>\n<blockquote><p>$ sudo apt-get install libgimp2.0-dev<\/p><\/blockquote>\n<p>i aprenem a programar un plugin a partir d&#8217;un tutorial que si cerques per Google segur que trobes:<\/p>\n<ul>\n\\t<\/p>\n<li><a href=\"http:\/\/developer.gimp.org\/writing-a-plug-in\/1\/index.html\">http:\/\/developer.gimp.org\/writing-a-plug-in\/1\/index.html<\/a><\/li>\n<\/ul>\n<p>Amb aquest tutorial, que implementa un <strong>blur<\/strong> (difuminador) aprenem els conceptes b\u00e0sics de la programaci\u00f3 amb GIMP. Els nostres plugins els programarem amb llenguatge C. Per compilar el plugin farem:<\/p>\n<blockquote><p>$ gimptool-2.0 &#8211;install myblur.c<\/p><\/blockquote>\n<p>Per executar el plugin ho farem des de dins del GIMP amb <strong>Filtres &gt; Difumina &gt; My Blur<\/strong>. O tamb\u00e9 ho podem fer amb un script Script-Fu: <strong>Filtres &gt; Script-Fu &gt; Consola<\/strong><\/p>\n<blockquote><p>(plug-in-myblur run-mode image drawable)<\/p><\/blockquote>\n<p>on substituim <em>run-mode<\/em>, <em>image<\/em> i <em>drawable<\/em> pels valors correctes. Per exemple:<\/p>\n<blockquote><p>(plug-in-myblur RUN-NONINTERACTIVE 1 2)<\/p><\/blockquote>\n<p>Per\u00f2 a mi el que m&#8217;interessa \u00e9s executar plugins des de fora del GIMP, des de la consola. La primera manera de fer-ho \u00e9s amb el llenguatge de script propi del GIMP, el llenguatge <strong>Scheme<\/strong>.<\/p>\n<p>example_script.scm:<\/p>\n<blockquote><p>\n(<br \/>\ndefine (example-script inputFilename outputFileName)<br \/>\n(<br \/>\nlet* (<br \/>\n(image (car (gimp-file-load RUN-NONINTERACTIVE inputFilename inputFilename)))<br \/>\n(drawable (car (gimp-image-get-active-layer image)))<br \/>\n)<br \/>\n(plug-in-myblur RUN-NONINTERACTIVE image drawable)<br \/>\n(gimp-file-save RUN-NONINTERACTIVE image drawable outputFileName outputFileName)<br \/>\n)<br \/>\n)<\/p><\/blockquote>\n<p>Els script l&#8217;he de guardar en la carpeta de scripts del GIMP: <em>~\/.gimp-2.6\/scripts<\/em>. Per executar-lo puc invocar al GIMP en mode comanda (opci\u00f3 -b):<\/p>\n<blockquote><p>$ gimp -i -b &#8220;(example-script \\\\&#8221;confirmacion.jpg\\\\&#8221; \\\\&#8221;confirmacion_out.jpg\\\\&#8221;)&#8221; -b &#8220;(gimp-quit 0)&#8221;<br \/>\nbatch command executed successfully<\/p><\/blockquote>\n<p>Per\u00f2 encara no em conven\u00e7 aquesta manera de fer. Jo el que vull \u00e9s poder aplicar un plugin a una imatge oberta del GIMP, executant el plugin des de la consola, no des de dins del GIMP. I la clau est\u00e0 en saber que el GIMP t\u00e9 un servidor, el <strong>servidor Script-Fu<\/strong>, que treballa per defecte pel port 10008 i que escolta les peticions TCP que li v\u00e9nen de la xarxa (socket). Primer de tot hem d&#8217;arrencar el servidor:<\/p>\n<blockquote><p>Filtres &gt; Script-Fu &gt; Inicia el servidor<\/p><\/blockquote>\n<p>i efectivament puc connectar-me al servidor:<\/p>\n<blockquote><p>$ telnet localhost 10008<\/p><\/blockquote>\n<p>per\u00f2 aix\u00f2 no serveix de res si no s\u00e9 el protocol per comunicar-me amb aquest servidor. Aquest protocol est\u00e0 explicat en aquest enlla\u00e7:<\/p>\n<ul>\n<li><a href=\"http:\/\/docs.gimp.org\/en\/gimp-filters-script-fu.htmlhttp:\/\/\">http:\/\/docs.gimp.org\/en\/gimp-filters-script-fu.html<\/a><\/li>\n<\/ul>\n<p>no \u00e9s un protocol dif\u00edcil d&#8217;entendre o implementar. Per sort, al Google trobem el script <strong>servertest.py<\/strong> que implementa aquest protocol. Per exemple el podem trobar en un d&#8217;aquests enlla\u1e09os:<\/p>\n<ul>\n<li><a href=\"http:\/\/code.ohloh.net\/file?fid=P0nRNyEugGcSvUxVURQKblLqPI0&amp;cid=TqzJ3ucHvvE&amp;s=&amp;browser=Default#L0\">http:\/\/code.ohloh.net\/file?fid=P0nRNyEugGcSvUxVURQKblLqPI0&amp;cid=TqzJ3ucHvvE&amp;s=&amp;browser=Default#L0<\/a><\/li>\n<li>la meva wiki: <a href=\"http:\/\/wiki.joanillo.org\/index.php\/Programaci%C3%B3_GIMP#Servidor_Script-Fuhttp:\/\/\">http:\/\/wiki.joanillo.org\/index.php\/Programaci%C3%B3_GIMP#Servidor_Script-Fu<\/a><\/li>\n<\/ul>\n<p>Ara ja puc executar el meu plugin des de la shell:<\/p>\n<blockquote><p>$  python servertest.py<br \/>\nTrying ::1.<br \/>\nTrying 127.0.0.1.<br \/>\nScript-Fu-Remote &#8211; Testclient<br \/>\n&gt; (plug-in-myblur RUN-NONINTERACTIVE 1 2)<br \/>\n(OK): Success<br \/>\n&gt;<\/p><\/blockquote>\n<p>servertest.py treballa de forma interactiva. No em conven\u00e7. Faig una modificaci\u00f3 de manera que pugui treballar de forma totalment desatesa: script <strong>servertest_v2.py<\/strong> (<a href=\"http:\/\/wiki.joanillo.org\/index.php\/Programaci%C3%B3_GIMP#Servidor_Script-Fu\">http:\/\/wiki.joanillo.org\/index.php\/Programaci%C3%B3_GIMP#Servidor_Script-Fu<\/a>)<\/p>\n<blockquote><p>$ python servertest_v2.py localhost 10008 &#8220;(plug-in-myblur RUN-NONINTERACTIVE 1 2)&#8221;<br \/>\nHOST: localhost<br \/>\nPORT: 10008<br \/>\nCOMMAND: (plug-in-myblur RUN-NONINTERACTIVE 1 2)<br \/>\nTrying ::1.<br \/>\nTrying 127.0.0.1.<br \/>\n(plug-in-myblur RUN-NONINTERACTIVE 1 2)<br \/>\n(OK): Success<\/p><\/blockquote>\n<p>\u00c9s a dir, executo l&#8217;anterior comanda des de la consola, i de forma m\u00e0gica la imatge que tinc oberta en el GIMP queda difuminada.<\/p>\n<p>Ara nom\u00e9s falta executar aquesta comanda no des de la consola, sin\u00f3 des d&#8217;un executable de C, que \u00e9s el meu llenguatge de refer\u00e8ncia per desenvolupar futurs projectes:<\/p>\n<blockquote><p>\/\/ gcc -o execute_blur execute_blur.c<br \/>\nint main(int argc, char *argv[])<br \/>\n{<br \/>\n\\tsystem(&#8220;python servertest_v2.py localhost 10008 \\\\&#8221;(plug-in-myblur RUN-NONINTERACTIVE 1 2)\\\\&#8221;&#8221;);<br \/>\n}<\/p><\/blockquote>\n<blockquote><p>$ .\/execute_blur<\/p>\n<p>HOST: localhost<br \/>\nPORT: 10008<br \/>\nCOMMAND: (plug-in-myblur RUN-NONINTERACTIVE 1 2)<br \/>\nTrying ::1.<br \/>\nTrying 127.0.0.1.<br \/>\n(plug-in-myblur RUN-NONINTERACTIVE 1 2)<br \/>\n(OK): Success<\/p><\/blockquote>\n<p>i la imatge que tinc oberta en el GIMP queda difuminada.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Amb aquest article vull encetar una s\u00e8rie de posts sobre la programaci\u00f3 amb GIMP. No \u00e9s un tutorial per aprendre a programar GIMP, tan sols \u00e9s posar en ordre unes quantes idees enfocades a un futur projecte, que b\u00e0sicament \u00e9s desenvolupar un framework per poder explicar hist\u00f2ries tot dibuixant sobre la pantalla amb una wacom, [&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\/199"}],"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=199"}],"version-history":[{"count":1,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/199\/revisions"}],"predecessor-version":[{"id":200,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=\/wp\/v2\/posts\/199\/revisions\/200"}],"wp:attachment":[{"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=199"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=199"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.joanillo.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=199"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}