Script-fu a ladenie skriptu

chinaski

Script-fu a ladenie skriptu
« kdy: 11. 03. 2011, 19:56:53 »
Zdravim vas!

Prave pisem jednu pracu a jej sucastou ma byt aj script, ktory by upravil obrazok nasledovne.
  • Otocenie obrazku ak je ulozeny na vysku
  • Zmena velkosti na pozadovanu v pripade, ze ma ine rozmery. Potrebne je zachovat pomer
  • orezanie obrazku v pripade, ze nema vhodny pomer stran
  • pridanie ramu
  • pridanie podpisu

Ma to byt urobene v SCRIPT-FU...-scheme.... Niesom prave profik cez lisp a tiez nie cez gimp, tak ak mate niekto konstruktivne rady ako urobit upravit ten skript aby bol krajsi, efektivnejsi a hlavne uspornejsi tak vam budem vdacny....

:) toto som stvoril...ja...

Kód: [Vybrat]
(define (script-fu-img theImg layer BorderColor theTextSign theTextFont)
  (let*
 
    ( 
      (width (car (gimp-image-width theImg)) )
      (height (car (gimp-image-height theImg)) )

      (finalWidth 580)
      (finalHeight 360)

      (scaleWidth finalWidth)
      (scaleRatio (/ width height))     
      (scaleHeight (/ scaleWidth scaleRatio) )

      (borderX 10)
      (borderY 20)
      (textSignPositionX (+ borderX (- finalWidth 150)))
      (textSignPositionY (+ (* borderY 2) (- finalHeight borderY borderY )))
;      (textSignPositionY (+ borderX (- newHeight 50)))
    );assign values


      (if (< width height)
        (begin
  (car (gimp-image-rotate theImg ROTATE-90))
  (set! width (car (gimp-image-width theImg)) )
          (set! height (car (gimp-image-height theImg)) )   
; (set! scaleWidth (finalWidth) )  ->nepodstatné
         (set! scaleRatio (/ width height) )
         (set! scaleHeight (/ scaleWidth scaleRatio) )     
         )  ; OK
       )

     (if (> finalHeight scaleHeight)
       (begin
  (set! finalHeight scaleHeight)    ;Potrebne zmenit vyslednu vysku v pripade, ze je > ako skutocna inak crop vyhodi chybu,
  (set! textSignPositionY finalHeight)    ;Reload polohy textu
 
)
        )   

;

      (car (gimp-image-scale theImg scaleWidth scaleHeight)) ; meni_velkost pri dodrzani pomerov_OK

      (car (gimp-image-crop theImg finalWidth finalHeight 0 0)) ; OK
      (car (script-fu-addborder theImg layer borderX borderY BorderColor 0)) ; OK
     
      (car
   (gimp-text-fontname
      theImg
      -1
      textSignPositionX
      textSignPositionY
      theTextSign ;text
      21 ;border
      TRUE ;antialias
      15 ;size
      PIXELS ;
      theTextFont
   )
       ); farba pisma _OK?
     
     

  );end of let*

         
 
)

(script-fu-register
  "script-fu-img"                        ;func name
  "Image Processing"                                  ;menu label
  "..."              ;description
  "Maros Korinek"                             ;author
  "copyright 1997, Michael Terry;\
    2009, the GIMP Documentation Team"        ;copyright notice
  "October 27, 1997"                          ;date created
  ""                     ;image type that the script works on
    SF-IMAGE "theImg" 0
    SF-DRAWABLE "layer" 0
    SF-COLOR       "Border Color"         '(0 0 0)     ;color variable
    SF-STRING      "Text"          "Name"   ;a string variable
   ; SF-ADJUSTMENT "Image width" '(640 128 4096 128 10 0 1)  _na

    SF-FONT "label" "fontName"   
)
(script-fu-menu-register "script-fu-img" "<Image>/script-fu/")


« Poslední změna: 11. 03. 2011, 21:20:12 od Petr Krčmář »


chinaski

Re: Script-fu a ladenie skriptu
« Odpověď #1 kdy: 18. 03. 2011, 18:11:58 »
Notak ludia, nikto? : )

PS: Tie overovacie otázky ma ale riadne štvú...No odkial mám vedieť Apríl po česky :/

Inkvizitor

Re: Script-fu a ladenie skriptu
« Odpověď #2 kdy: 19. 03. 2011, 12:38:50 »
Tak se mi zdá, že sis zamiloval funkci car. Nikdy jsem ve script-fu nedělal, ale podle mě ty cary jsou tam minimálně v posledních 4 příkazech zbytečné. Pokud chceš, aby to vypadalo líp, rozděl tu logiku do více funkcí a ty volej z té hlavní - zejména ty šachy při otáčení obrázku a nový výpočet těch hodnot vypadají nepěkně. Trochy větší pečlivost při zarovnávání by taky neškodila.

Inkvizitor

Re: Script-fu a ladenie skriptu
« Odpověď #3 kdy: 19. 03. 2011, 12:47:08 »
Hlavní funkce by IMO měla vypadat zhruba (sign (addborder (crop  (resize (rotate img))))) - další parametry přidej podle potřeby. Pak to bude vypadat jako Lisp a ne jako nepovedený Pascal.  ;)

chinaski

Re: Script-fu a ladenie skriptu
« Odpověď #4 kdy: 19. 03. 2011, 15:48:17 »
Ono to je scheme použíté pre GIMP a konvencia ako sa volajú funkcie je cez
 (car (nazov-funkcie parameter1 ... parameterx))

a hej,....je mi jasné, že to vyzerá dosť zle, ale prvý raz robím s lispom .... a neučil som sa viac ako je nutné, všetko viem z ( http://docs.gimp.org/2.2/cs/gimp-using-script-fu-tutorial-script.html )....a cieľom scriptu je prezentovať záklandné použitie script-fu ....a je to súčasť mojej bakalárky :DD.....a viem, že toto by som tam nemal dať, lebo ma obesia zato....pretoh hľadám nejakého machra, čo to skrášli :)


Inkvizitor

Re: Script-fu a ladenie skriptu
« Odpověď #5 kdy: 19. 03. 2011, 17:34:33 »
car je funkce, která vrací první prvek ze seznamu. Pokud Tě návratová hodnota nezajímá, je tam k ničemu. Tady nejde o konvenci, ale o to, že standardní funkce script-fu vracejí vždycky seznam, přestože obsahuje často jenom jednu hodnotu.

Rozdělit funkci zvládneš.

chinaski

Re: Script-fu a ladenie skriptu
« Odpověď #6 kdy: 20. 03. 2011, 17:05:44 »
Rozdeliť funckiu zvládnem, ale čo som pozeral, ani konplikovanejšie nezvykli deliť, nieje to podstatne...Ide skôr o demonštráciu toho ako sa používa fu. a tú debilné ratio som nevedel inak vyriešiť... Robil som to už dávnejšie....ja niesom programátor, mal som až jeden semester Cčko:D...

A keď som car vypustil, tak to vyhadzovalo chybu, všetko možné som skúšal.....

Vies navrhnut ako by to slo premenit _ ? : )

chinaski

Re: Script-fu a ladenie skriptu
« Odpověď #7 kdy: 20. 03. 2011, 17:46:03 »
jasnéé !!....už mi to došlo :D... tak som teda vymazal všetky car okrem tých ktoré zisťovali rozmery  : )

Inkvizitor

Re: Script-fu a ladenie skriptu
« Odpověď #8 kdy: 20. 03. 2011, 23:58:46 »
Pokud se v tom nechceš moc babrat, nech to prostě být. cary jsi vyhodil, pořešil bych to odsazení, aby to hezky vypadalo, přidej komentáře, kde to budeš považovat za vhodné a je to.

Já osobně nemám v podobných jazycích rád imperativní styl programování (jako v C - set! apod.), to rozdělení do funkcí bych já udělal jednak proto, aby to vypadalo názorněji a jednak se tak snadněji vyhneš zbytečnému přepočítávání hodnot. Ale to by asi chtělo se víc zahloubat do jazyků typu Lisp. Tohle je Tvoje práce a výsledek by měl být takový, aby odpovídal Tvému zaměření a zkušenostem.

chinaski

Re: Script-fu a ladenie skriptu
« Odpověď #9 kdy: 25. 03. 2011, 22:51:44 »
Díky za komenty... Trochu som to opravil....lebo to ratio bolo fakt obludné....A čisto z estetickej stránky by ma zaujímal názor.....ešte pridám tie komentáre...
Kód: [Vybrat]
(define (script-fu-imgp theImg layer BorderColor theTextSign theTextFont)
  (let*
    ( 
      (width (car (gimp-image-width theImg)) )
      (height (car (gimp-image-height theImg)) )
      (r 0)
      (finalWidth 300)
      (finalHeight 200)

      (scaleWidth finalWidth)
      (scaleHeight finalHeight)
      (ratio 1)

      (signY 1)
      (signX 1)
    ); assign value

  (if (< width height)
    (gimp-image-rotate theImg ROTATE-90)
    (set! r 1)
  )

  (if (> finalHeight scaleHeight)
     (set! finalHeight scaleHeight)    ;Potrebne zmenit vyslednu vysku v pripade, ze je > ako skutocna inak crop vyhodi chybu,
     (set! signY finalHeight)    ;Reload polohy textu
  )

  (cond
   ((= r 0)
      (set! ratio (/ width height) )     
      (set! scaleHeight (/ scaleWidth ratio)))
    (else
     (set! ratio (/ height width) )     
      (set! scaleHeight (/ scaleWidth ratio))
    )
  )

  (gimp-image-scale theImg scaleWidth scaleHeight)
  (gimp-image-crop theImg  finalWidth finalHeight 0 0)
  (script-fu-addborder theImg layer borderX borderY BorderColor 0)
 

))




(script-fu-register
  "script-fu-imgp"                        ;func name
  "Image"                                  ;menu label
  "..."              ;description
  "Maros Korinek"                             ;author
  "copyright 2011, "        ;copyright notice
  "October 27, 1997"                          ;date created
  ""                     ;image type that the script works on
    SF-IMAGE "theImg" 0
    SF-DRAWABLE "layer" 0
    SF-COLOR       "Border Color"         '(0 0 0)     ;color variable
    SF-STRING      "Text"          "Name"   ;a string variable
   ; SF-ADJUSTMENT "Image width" '(640 128 4096 128 10 0 1)  _na

    SF-FONT "label" "fontName"   
)

(script-fu-menu-register "script-fu-imgp" "<Image>/script-fu/")