Error processing request

Parameters

CONTENT_LENGTH0
REQUEST_METHODGET
REQUEST_URI/revision/Image+Processing+with+HSV?V=21
QUERY_STRINGV=21
CONTENT_TYPE
DOCUMENT_URI/revision/Image+Processing+with+HSV
DOCUMENT_ROOT/var/www/nikit/nikit/nginx/../docroot
SCGI1
SERVER_PROTOCOLHTTP/1.1
HTTPSon
REMOTE_ADDR172.69.6.236
REMOTE_PORT65410
SERVER_PORT4443
SERVER_NAMEwiki.tcl-lang.org
HTTP_HOSTwiki.tcl-lang.org
HTTP_CONNECTIONKeep-Alive
HTTP_ACCEPT_ENCODINGgzip, br
HTTP_X_FORWARDED_FOR3.16.212.99
HTTP_CF_RAY879cd5209c2f61a3-ORD
HTTP_X_FORWARDED_PROTOhttps
HTTP_CF_VISITOR{"scheme":"https"}
HTTP_ACCEPT*/*
HTTP_USER_AGENTMozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; [email protected])
HTTP_CF_CONNECTING_IP3.16.212.99
HTTP_CDN_LOOPcloudflare
HTTP_CF_IPCOUNTRYUS

Body


Error

Unknow state transition: LINE -> END

-code

1

-level

0

-errorstack

INNER {returnImm {Unknow state transition: LINE -> END} {}} CALL {my render_wikit {Image Processing with HSV} \[ulis\],\ 2003-12-07.\ A\ proc\ to\ manipulate\ HSV\ components.\n\n\[David\ Easton\],\ 2003-12-08.\ Speedup\ using\ \"<photo>\ get\"\n\n\[http://perso.wanadoo.fr/maurice.ulis/tcl/hsv1.png\]\n\[http://perso.wanadoo.fr/maurice.ulis/tcl/hsv2.png\]\n\[http://perso.wanadoo.fr/maurice.ulis/tcl/hsv3.png\]\n\[http://perso.wanadoo.fr/maurice.ulis/tcl/hsv4.png\]\n\[http://perso.wanadoo.fr/maurice.ulis/tcl/hsv5.png\]\n\n(Original\ photo:\ \[to\ fill\])\n\n----\n\n'''What\ it\ does'''\n\ \ \n\ \ The\ -s\ option\ manipulates\ the\ saturation:\n\ \ \ \ *\ a\ value\ less\ than\ 1.0\ reduces\ the\ saturation,\n\ \ \ \ *\ a\ value\ greater\ than\ 1.0\ increases\ the\ saturation.\n\ \ The\ -v\ option\ manipulates\ the\ brightness:\n\ \ \ \ *\ a\ value\ less\ than\ 1.0\ reduces\ the\ brightness,\n\ \ \ \ *\ a\ value\ greater\ than\ 1.0\ increases\ the\ brightness.\n\ \n----\n\n'''How\ it\ works'''\n\ \ \n\ \ \ \ :\ \ \ It\ works\ by\ computing\ and\ manipulating\ the\ HSV\ components\ then\ coming\ back\ to\ RGB.\n\n\[KPV\]\ For\ further\ information,\ check\ out\ ''\[http://web.archive.org/web/20130929202237/http://visl.technion.ac.il/labs/anat/hsvspace.pdf%|%Adventures\ in\ HSV\ Space\]''\ \n\ \n----\n\n'''The\ proc'''\n======\npackage\ require\ Tk\n\nnamespace\ eval\ ::hsv\ \{\n\ \ \ \ namespace\ export\ hsv\n\n\ \ \ \ proc\ hsv\ args\ \{\n\ \ \ \ \ \ \ \ #\ check\ args\n\ \ \ \ \ \ \ \ if\ \{\[llength\ \$args\]\ <\ 1\ ||\ \[llength\ \$args\]\ %\ 2\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ -code\ error\ \{wrong\ #\ args:\ should\ be\ \"hsv\ ?-s\ saturation?\ ?-v\ value?\"\ image\}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ set\ image\ \[lindex\ \$args\ end\]\n\ \ \ \ \ \ \ \ foreach\ \{key\ value\}\ \[lrange\ \$args\ 0\ end-1\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ switch\ -glob\ --\ \$key\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ -s*\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{abs(\$value\ -\ 1.0)\ >\ 1.e-5\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ options(saturation)\ \$value\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ -v*\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{abs(\$value\ -\ 1.0)\ >\ 1.e-5\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ options(value)\ \$value\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ default\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ -code\ error\ \[format\ \{unknown\ option\ \"%s\":\ should\ be\ -s\ or\ -v\}\ \$key\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ if\ \{!\[info\ exists\ options(saturation)\]\ &&\ !\[info\ exists\ options(value)\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$image\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ get\ the\ old\ image\ content\n\ \ \ \ \ \ \ \ set\ width\ \[image\ width\ \$image\]\n\ \ \ \ \ \ \ \ set\ height\ \[image\ height\ \$image\]\n\ \ \ \ \ \ \ \ if\ \{\$width\ *\ \$height\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ -code\ error\ \"bad\ image\"\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ create\ corresponding\ planes\n\ \ \ \ \ \ \ \ for\ \{set\ y\ 0\}\ \{\$y\ <\ \$height\}\ \{incr\ y\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ set\ row2\ \{\}\n\ \ \ \ \ \ \ \ \ \ \ \ for\ \{set\ x\ 0\}\ \{\$x\ <\ \$width\}\ \{incr\ x\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ \{rgb(r)\ rgb(g)\ rgb(b)\}\ \[\$image\ get\ \$x\ \$y\]\ break\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ #\ convert\ to\ HSV\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ min\ \[expr\ \{min(\$rgb(r),\ \$rgb(g),\ \$rgb(b))\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ max\ \[expr\ \{max(\$rgb(r),\ \$rgb(g),\ \$rgb(b))\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ v\ \$max\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ delta\ \[expr\ \{\$max\ -\ \$min\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$max\ ==\ 0\ ||\ \$delta\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ s\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ h\ -1\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ s\ \[expr\ \{\$delta\ /\ double(\$max)\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$rgb(r)\ ==\ \$max\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ h\ \[expr\ \{0.0\ \ \ +\ (\$rgb(g)\ -\ \$rgb(b))\ *\ 60.0\ /\ \$delta\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\$rgb(g)\ ==\ \$max\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ h\ \[expr\ \{120.0\ +\ (\$rgb(b)\ -\ \$rgb(r))\ *\ 60.0\ /\ \$delta\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ h\ \[expr\ \{240.0\ +\ (\$rgb(r)\ -\ \$rgb(g))\ *\ 60.0\ /\ \$delta\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$h\ <\ 0.0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ h\ \[expr\ \{\$h\ +\ 360.0\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ #\ manipulate\ HSV\ components\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[info\ exists\ options(saturation)\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ s\ \[expr\ \{\$s\ *\ \$options(saturation)\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[info\ exists\ options(value)\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ v\ \[expr\ \{\$v\ *\ \$options(value)\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ #\ convert\ to\ RGB\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$s\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ c\ \{r\ g\ b\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ rgb(\$c)\ \[expr\ \{int(\$v)\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ f\ \[expr\ \{\$h\ /\ 60.0\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ i\ \[expr\ \{int(\$f)\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ f\ \[expr\ \{\$f\ -\ \$i\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ p\ \[expr\ \{\$v\ *\ (1\ -\ \$s)\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ q\ \[expr\ \{\$v\ *\ (1\ -\ \$s\ *\ \$f)\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ t\ \[expr\ \{\$v\ *\ (1\ -\ \$s\ *\ (1\ -\ \$f))\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ vals\ \[subst\ \[lindex\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\$v\ \$t\ \$p\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\$q\ \$v\ \$p\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\$p\ \$v\ \$t\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\$p\ \$q\ \$v\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\$t\ \$p\ \$v\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\$v\ \$p\ \$q\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ \$i\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ c\ \{r\ g\ b\}\ v\ \$vals\ \{\ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ v\ \[expr\ \{int(\$v)\}\]\ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$v\ <\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ rgb(\$c)\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\$v\ >\ 255\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ rgb(\$c)\ 255\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ rgb(\$c)\ \$v\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lappend\ row2\ \[format\ #%02x%02x%02x\ \$rgb(r)\ \$rgb(g)\ \$rgb(b)\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ lappend\ data2\ \$row2\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ create\ the\ new\ image\n\ \ \ \ \ \ \ \ set\ image2\ \[image\ create\ photo\]\n\ \ \ \ \ \ \ \ #\ fill\ the\ new\ image\n\ \ \ \ \ \ \ \ \$image2\ put\ \$data2\n\ \ \ \ \ \ \ \ #\ return\ the\ new\ image\n\ \ \ \ \ \ \ \ return\ \$image2\n\ \ \ \ \}\n\}\n======\n\n\n'''The\ demo'''\n\n(Original\ image\ `http://perso.wanadoo.fr/maurice.ulis/tcl/image5.png`\ is\ missing.)\n======\npackage\ require\ Img\nimage\ create\ photo\ Photo\ -file\ wmpnss_color120.png\nnamespace\ import\ ::hsv::hsv\nwm\ withdraw\ .\ntoplevel\ .t\nwm\ title\ .t\ hsv\ncanvas\ .t.c\ -bd\ 0\ -highlightt\ 0\nset\ h\ \[image\ height\ Photo\]\nset\ w\ \[image\ width\ Photo\]\nset\ x()\ 0\nset\ y()\ 0\nset\ x(-v)\ \$w\nset\ y(-v)\ 0\nset\ x(-s)\ \[expr\ \{2\ *\ \$w\}\]\nset\ y(-s)\ 0\nforeach\ args\ \{\{\}\ \{-v\ 0.5\}\ \{-v\ 1.5\}\ \{-s\ 0.5\}\ \{-s\ 1.5\}\}\ \{\n\ \ \ \ set\ image\ \[hsv\ \{*\}\$args\ Photo\]\n\ \ \ \ set\ k\ \[lindex\ \$args\ 0\]\n\ \ \ \ .t.c\ create\ text\ \$x(\$k)\ \$y(\$k)\ -anchor\ nw\ -text\ \"Options:\ \$args\"\n\ \ \ \ .t.c\ create\ image\ \$x(\$k)\ \[incr\ y(\$k)\ 20\]\ -anchor\ nw\ -image\ \$image\n\ \ \ \ incr\ y(\$k)\ \$h\n\}\nlassign\ \[.t.c\ bbox\ all\]\ -\ -\ width\ height\n.t.c\ config\ -width\ \$width\ -height\ \$height\npack\ .t.c\nbind\ .t.c\ <Destroy>\ exit\n======\n----\n\n'''Minor\ Addition'''\n\nI\ made\ a\ modified\ version\ of\ this\ code\ to\ allow\ a\ quick\ and\ easy\ greyscale\ conversion.\ \ THe\ process\ is\ quite\ fast\ and\ simple.\ \ Just\ grab\ the\ HSV\ and\ never\ go\ back\ to\ RGB.\n======\n\ \ \ \ \ \ \ \ proc\ BW\ \{\ data\ \}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[catch\ \{set\ width\ \[image\ width\ \$data\]\}\ blah\ \]\}\ \{return\ 0\;\}\n\ \ \ \ \ \ \ \ \ \ \ \ set\ height\ \[image\ height\ \$data\]\n\ \ \ \ \ \ \ \ \ \ \ \ for\ \{set\ y\ 0\}\ \{\$y\ <\ \$height\}\ \{incr\ y\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ update\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ row\ \{\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ r:row\ \{\}\;\ set\ g:row\ \{\}\;\ set\ b:row\ \{\}\;\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ for\ \{set\ x\ 0\}\ \{\$x\ <\ \$width\}\ \{incr\ x\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ \{r\ g\ b\}\ \[\$data\ get\ \$x\ \$y\]\ break\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ min\ \[expr\ \{\$r\ <\ \$g\ ?\ \$r\ :\ \$g\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ min\ \[expr\ \{\$b\ <\ \$min\ ?\ \$b\ :\ \$min\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ max\ \[expr\ \{\$r\ >\ \$g\ ?\ \$r\ :\ \$g\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ max\ \[expr\ \{\$b\ >\ \$max\ ?\ \$b\ :\ \$max\}\]\n\ \ \ \ \ \ \ \ #\ fill\ the\ new\ image\n\ \ \ \ \ \ \ \ \$image2\ put\ \$data2\n\ \ \ \ \ \ \ \ #\ return\ the\ new\ image\n\ \ \ \ \ \ \ \ return\ \$image2\n\ \ \ \ \}\n\n\}\n======\n----\n\n\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ v\ \$max\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ c\ \{r\ g\ b\}\ \{set\ \$c\ \[expr\ \{int(\$v)\}\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lappend\ row\ \[format\ #%02x%02x%02x\ \$r\ \$g\ \$b\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lappend\ data2\ \$row\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ set\ bw\ \[image\ create\ photo\]\n\ \ \ \ \ \ \ \ \ \ \ \ \$bw\ put\ \$data2\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$bw\n\ \ \ \ \ \ \ \ \}\n======\n*\ modified\ by\ Barry\ Skidmore\n\n----\n\n'''See\ also'''\n\n\ \ \ *\ \[Blurring\ an\ image\]\n\ \ \ *\ \[Crisping\ an\ image\]\n\ \ \ *\ \[Embossing\ an\ image\]\n\ \ \ *\ \[Expanding\ an\ image\]\n\ \ \ *\ \[Shrinking\ an\ image\]\n----\n\[gold\]\ test\ of\ inline\ images\ (from\ above)\nImage\ Processing\ with\ HSV\ ,\ headliner\ photos\n\[Image\ Processing\ with\ HSV\ hav1\ png\]\n\[Image\ Processing\ with\ HSV\ hav2\ png\]\n\[Image\ Processing\ with\ HSV\ hav3\ x3\ png\]\n\[Image\ Processing\ with\ HSV\ hav4\ png\]\n\[Image\ Processing\ with\ HSV\ hav5\ png\]\n\nImage\ Processing\ with\ HSV,\ \ image\ 5\ listed\ in\ middle\ page\ (Original\ photo?)\n\[Image\ Processing\ with\ HSV\ image\ 5\ listed\ in\ middle\ page\]\n----\n<<categories>>\ Graphics\ |\ Image\ Processing\ |\ Example regexp2} CALL {my render {Image Processing with HSV} \[ulis\],\ 2003-12-07.\ A\ proc\ to\ manipulate\ HSV\ components.\n\n\[David\ Easton\],\ 2003-12-08.\ Speedup\ using\ \"<photo>\ get\"\n\n\[http://perso.wanadoo.fr/maurice.ulis/tcl/hsv1.png\]\n\[http://perso.wanadoo.fr/maurice.ulis/tcl/hsv2.png\]\n\[http://perso.wanadoo.fr/maurice.ulis/tcl/hsv3.png\]\n\[http://perso.wanadoo.fr/maurice.ulis/tcl/hsv4.png\]\n\[http://perso.wanadoo.fr/maurice.ulis/tcl/hsv5.png\]\n\n(Original\ photo:\ \[to\ fill\])\n\n----\n\n'''What\ it\ does'''\n\ \ \n\ \ The\ -s\ option\ manipulates\ the\ saturation:\n\ \ \ \ *\ a\ value\ less\ than\ 1.0\ reduces\ the\ saturation,\n\ \ \ \ *\ a\ value\ greater\ than\ 1.0\ increases\ the\ saturation.\n\ \ The\ -v\ option\ manipulates\ the\ brightness:\n\ \ \ \ *\ a\ value\ less\ than\ 1.0\ reduces\ the\ brightness,\n\ \ \ \ *\ a\ value\ greater\ than\ 1.0\ increases\ the\ brightness.\n\ \n----\n\n'''How\ it\ works'''\n\ \ \n\ \ \ \ :\ \ \ It\ works\ by\ computing\ and\ manipulating\ the\ HSV\ components\ then\ coming\ back\ to\ RGB.\n\n\[KPV\]\ For\ further\ information,\ check\ out\ ''\[http://web.archive.org/web/20130929202237/http://visl.technion.ac.il/labs/anat/hsvspace.pdf%|%Adventures\ in\ HSV\ Space\]''\ \n\ \n----\n\n'''The\ proc'''\n======\npackage\ require\ Tk\n\nnamespace\ eval\ ::hsv\ \{\n\ \ \ \ namespace\ export\ hsv\n\n\ \ \ \ proc\ hsv\ args\ \{\n\ \ \ \ \ \ \ \ #\ check\ args\n\ \ \ \ \ \ \ \ if\ \{\[llength\ \$args\]\ <\ 1\ ||\ \[llength\ \$args\]\ %\ 2\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ -code\ error\ \{wrong\ #\ args:\ should\ be\ \"hsv\ ?-s\ saturation?\ ?-v\ value?\"\ image\}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ set\ image\ \[lindex\ \$args\ end\]\n\ \ \ \ \ \ \ \ foreach\ \{key\ value\}\ \[lrange\ \$args\ 0\ end-1\]\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ switch\ -glob\ --\ \$key\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ -s*\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{abs(\$value\ -\ 1.0)\ >\ 1.e-5\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ options(saturation)\ \$value\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ -v*\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{abs(\$value\ -\ 1.0)\ >\ 1.e-5\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ options(value)\ \$value\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ default\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ return\ -code\ error\ \[format\ \{unknown\ option\ \"%s\":\ should\ be\ -s\ or\ -v\}\ \$key\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ if\ \{!\[info\ exists\ options(saturation)\]\ &&\ !\[info\ exists\ options(value)\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$image\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ get\ the\ old\ image\ content\n\ \ \ \ \ \ \ \ set\ width\ \[image\ width\ \$image\]\n\ \ \ \ \ \ \ \ set\ height\ \[image\ height\ \$image\]\n\ \ \ \ \ \ \ \ if\ \{\$width\ *\ \$height\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ return\ -code\ error\ \"bad\ image\"\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ create\ corresponding\ planes\n\ \ \ \ \ \ \ \ for\ \{set\ y\ 0\}\ \{\$y\ <\ \$height\}\ \{incr\ y\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ set\ row2\ \{\}\n\ \ \ \ \ \ \ \ \ \ \ \ for\ \{set\ x\ 0\}\ \{\$x\ <\ \$width\}\ \{incr\ x\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ \{rgb(r)\ rgb(g)\ rgb(b)\}\ \[\$image\ get\ \$x\ \$y\]\ break\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ #\ convert\ to\ HSV\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ min\ \[expr\ \{min(\$rgb(r),\ \$rgb(g),\ \$rgb(b))\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ max\ \[expr\ \{max(\$rgb(r),\ \$rgb(g),\ \$rgb(b))\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ v\ \$max\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ delta\ \[expr\ \{\$max\ -\ \$min\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$max\ ==\ 0\ ||\ \$delta\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ s\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ h\ -1\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ s\ \[expr\ \{\$delta\ /\ double(\$max)\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$rgb(r)\ ==\ \$max\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ h\ \[expr\ \{0.0\ \ \ +\ (\$rgb(g)\ -\ \$rgb(b))\ *\ 60.0\ /\ \$delta\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\$rgb(g)\ ==\ \$max\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ h\ \[expr\ \{120.0\ +\ (\$rgb(b)\ -\ \$rgb(r))\ *\ 60.0\ /\ \$delta\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ h\ \[expr\ \{240.0\ +\ (\$rgb(r)\ -\ \$rgb(g))\ *\ 60.0\ /\ \$delta\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$h\ <\ 0.0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ h\ \[expr\ \{\$h\ +\ 360.0\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ #\ manipulate\ HSV\ components\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[info\ exists\ options(saturation)\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ s\ \[expr\ \{\$s\ *\ \$options(saturation)\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[info\ exists\ options(value)\]\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ v\ \[expr\ \{\$v\ *\ \$options(value)\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ #\ convert\ to\ RGB\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$s\ ==\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ c\ \{r\ g\ b\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ rgb(\$c)\ \[expr\ \{int(\$v)\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ f\ \[expr\ \{\$h\ /\ 60.0\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ i\ \[expr\ \{int(\$f)\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ f\ \[expr\ \{\$f\ -\ \$i\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ p\ \[expr\ \{\$v\ *\ (1\ -\ \$s)\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ q\ \[expr\ \{\$v\ *\ (1\ -\ \$s\ *\ \$f)\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ t\ \[expr\ \{\$v\ *\ (1\ -\ \$s\ *\ (1\ -\ \$f))\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ vals\ \[subst\ \[lindex\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\$v\ \$t\ \$p\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\$q\ \$v\ \$p\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\$p\ \$v\ \$t\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\$p\ \$q\ \$v\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\$t\ \$p\ \$v\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \{\$v\ \$p\ \$q\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ \$i\]\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ c\ \{r\ g\ b\}\ v\ \$vals\ \{\ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ v\ \[expr\ \{int(\$v)\}\]\ \n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \{\$v\ <\ 0\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ rgb(\$c)\ 0\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ elseif\ \{\$v\ >\ 255\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ rgb(\$c)\ 255\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ else\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ rgb(\$c)\ \$v\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lappend\ row2\ \[format\ #%02x%02x%02x\ \$rgb(r)\ \$rgb(g)\ \$rgb(b)\]\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ lappend\ data2\ \$row2\n\ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ #\ create\ the\ new\ image\n\ \ \ \ \ \ \ \ set\ image2\ \[image\ create\ photo\]\n\ \ \ \ \ \ \ \ #\ fill\ the\ new\ image\n\ \ \ \ \ \ \ \ \$image2\ put\ \$data2\n\ \ \ \ \ \ \ \ #\ return\ the\ new\ image\n\ \ \ \ \ \ \ \ return\ \$image2\n\ \ \ \ \}\n\}\n======\n\n\n'''The\ demo'''\n\n(Original\ image\ `http://perso.wanadoo.fr/maurice.ulis/tcl/image5.png`\ is\ missing.)\n======\npackage\ require\ Img\nimage\ create\ photo\ Photo\ -file\ wmpnss_color120.png\nnamespace\ import\ ::hsv::hsv\nwm\ withdraw\ .\ntoplevel\ .t\nwm\ title\ .t\ hsv\ncanvas\ .t.c\ -bd\ 0\ -highlightt\ 0\nset\ h\ \[image\ height\ Photo\]\nset\ w\ \[image\ width\ Photo\]\nset\ x()\ 0\nset\ y()\ 0\nset\ x(-v)\ \$w\nset\ y(-v)\ 0\nset\ x(-s)\ \[expr\ \{2\ *\ \$w\}\]\nset\ y(-s)\ 0\nforeach\ args\ \{\{\}\ \{-v\ 0.5\}\ \{-v\ 1.5\}\ \{-s\ 0.5\}\ \{-s\ 1.5\}\}\ \{\n\ \ \ \ set\ image\ \[hsv\ \{*\}\$args\ Photo\]\n\ \ \ \ set\ k\ \[lindex\ \$args\ 0\]\n\ \ \ \ .t.c\ create\ text\ \$x(\$k)\ \$y(\$k)\ -anchor\ nw\ -text\ \"Options:\ \$args\"\n\ \ \ \ .t.c\ create\ image\ \$x(\$k)\ \[incr\ y(\$k)\ 20\]\ -anchor\ nw\ -image\ \$image\n\ \ \ \ incr\ y(\$k)\ \$h\n\}\nlassign\ \[.t.c\ bbox\ all\]\ -\ -\ width\ height\n.t.c\ config\ -width\ \$width\ -height\ \$height\npack\ .t.c\nbind\ .t.c\ <Destroy>\ exit\n======\n----\n\n'''Minor\ Addition'''\n\nI\ made\ a\ modified\ version\ of\ this\ code\ to\ allow\ a\ quick\ and\ easy\ greyscale\ conversion.\ \ THe\ process\ is\ quite\ fast\ and\ simple.\ \ Just\ grab\ the\ HSV\ and\ never\ go\ back\ to\ RGB.\n======\n\ \ \ \ \ \ \ \ proc\ BW\ \{\ data\ \}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ if\ \{\[catch\ \{set\ width\ \[image\ width\ \$data\]\}\ blah\ \]\}\ \{return\ 0\;\}\n\ \ \ \ \ \ \ \ \ \ \ \ set\ height\ \[image\ height\ \$data\]\n\ \ \ \ \ \ \ \ \ \ \ \ for\ \{set\ y\ 0\}\ \{\$y\ <\ \$height\}\ \{incr\ y\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ update\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ row\ \{\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ r:row\ \{\}\;\ set\ g:row\ \{\}\;\ set\ b:row\ \{\}\;\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ for\ \{set\ x\ 0\}\ \{\$x\ <\ \$width\}\ \{incr\ x\}\ \{\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ \{r\ g\ b\}\ \[\$data\ get\ \$x\ \$y\]\ break\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ min\ \[expr\ \{\$r\ <\ \$g\ ?\ \$r\ :\ \$g\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ min\ \[expr\ \{\$b\ <\ \$min\ ?\ \$b\ :\ \$min\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ max\ \[expr\ \{\$r\ >\ \$g\ ?\ \$r\ :\ \$g\}\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ max\ \[expr\ \{\$b\ >\ \$max\ ?\ \$b\ :\ \$max\}\]\n\ \ \ \ \ \ \ \ #\ fill\ the\ new\ image\n\ \ \ \ \ \ \ \ \$image2\ put\ \$data2\n\ \ \ \ \ \ \ \ #\ return\ the\ new\ image\n\ \ \ \ \ \ \ \ return\ \$image2\n\ \ \ \ \}\n\n\}\n======\n----\n\n\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ v\ \$max\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ foreach\ c\ \{r\ g\ b\}\ \{set\ \$c\ \[expr\ \{int(\$v)\}\]\}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lappend\ row\ \[format\ #%02x%02x%02x\ \$r\ \$g\ \$b\]\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lappend\ data2\ \$row\n\ \ \ \ \ \ \ \ \ \ \ \ \}\n\ \ \ \ \ \ \ \ \ \ \ \ set\ bw\ \[image\ create\ photo\]\n\ \ \ \ \ \ \ \ \ \ \ \ \$bw\ put\ \$data2\n\ \ \ \ \ \ \ \ \ \ \ \ return\ \$bw\n\ \ \ \ \ \ \ \ \}\n======\n*\ modified\ by\ Barry\ Skidmore\n\n----\n\n'''See\ also'''\n\n\ \ \ *\ \[Blurring\ an\ image\]\n\ \ \ *\ \[Crisping\ an\ image\]\n\ \ \ *\ \[Embossing\ an\ image\]\n\ \ \ *\ \[Expanding\ an\ image\]\n\ \ \ *\ \[Shrinking\ an\ image\]\n----\n\[gold\]\ test\ of\ inline\ images\ (from\ above)\nImage\ Processing\ with\ HSV\ ,\ headliner\ photos\n\[Image\ Processing\ with\ HSV\ hav1\ png\]\n\[Image\ Processing\ with\ HSV\ hav2\ png\]\n\[Image\ Processing\ with\ HSV\ hav3\ x3\ png\]\n\[Image\ Processing\ with\ HSV\ hav4\ png\]\n\[Image\ Processing\ with\ HSV\ hav5\ png\]\n\nImage\ Processing\ with\ HSV,\ \ image\ 5\ listed\ in\ middle\ page\ (Original\ photo?)\n\[Image\ Processing\ with\ HSV\ image\ 5\ listed\ in\ middle\ page\]\n----\n<<categories>>\ Graphics\ |\ Image\ Processing\ |\ Example} CALL {my revision {Image Processing with HSV}} CALL {::oo::Obj709518 process revision/Image+Processing+with+HSV} CALL {::oo::Obj709516 process}

-errorcode

NONE

-errorinfo

Unknow state transition: LINE -> END
    while executing
"error $msg"
    (class "::Wiki" method "render_wikit" line 6)
    invoked from within
"my render_$default_markup $N $C $mkup_rendering_engine"
    (class "::Wiki" method "render" line 8)
    invoked from within
"my render $name $C"
    (class "::Wiki" method "revision" line 31)
    invoked from within
"my revision $page"
    (class "::Wiki" method "process" line 56)
    invoked from within
"$server process [string trim $uri /]"

-errorline

4