Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: chinaski 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...
(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/")
-
Notak ludia, nikto? : )
PS: Tie overovacie otázky ma ale riadne štvú...No odkial mám vedieť Apríl po česky :/
-
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.
-
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. ;)
-
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 (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 :)
-
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š.
-
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 _ ? : )
-
jasnéé !!....už mi to došlo :D... tak som teda vymazal všetky car okrem tých ktoré zisťovali rozmery : )
-
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.
-
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...
(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/")