|Portada|Blog|Space|

[Índice] > Plugin para fotos en XChat

Continuando con la serie de plugins para xchat, esta vez vengo a
presentarles uno bastante interesante, un plugin que permite de forma
fácil y gráfica sacar fotos con una cámara de video, mostrándolas en
pantalla para poder confirmarlas o volver a capturar, convirtiéndolas a
jpeg y subiéndolas por ssh a un servidor web.

Por un tema de prolijidad, separé en dos partes el código, por un lado
el plugin de xchat, y por otro lado un programa sacar-foto.tcl que hace
lo que su nombre indica y de paso provee la interfaz de usuario.

sacar-foto.tcl:


#!/bin/sh
#\
exec tclsh "$0" "$@"

package require Tk

# Procedimiento que llama al mplayer para que guarde en archivos PNM los
# frames de video capturados, crea una imagen de tk a partir del archivo
# y borra estos frames temporales.

proc tv_torimasu {} {
  catch {exec mplayer -vo pnm:outdir=/dev/shm -frames 10 tv://} res
  set img [image create photo -file /dev/shm/00000010.ppm]
  foreach file [glob -nocomplain -- /dev/shm/000000*.ppm] {
    file delete -- $file
  }
  return $img
}

# Procedimiento que crea la ventana con los botoncitos y esas cosas, se
# encarga además de tomar además la primer foto.

proc iface_new {w pict_cmd ok_cmd} {
  canvas $w.c -width 640 -height 480
  frame $w.f
  pack [button $w.f.bok -text OK] -side right -expand 1 -fill x
  button $w.f.bagain -text もういちど -command [list iface_torimasu $w $pict_cmd $ok_cmd]
  iface_torimasu $w $pict_cmd $ok_cmd
  pack $w.f.bagain -side left -expand 1 -fill x
  pack $w.c
  pack $w.f -fill x
}

# Procedimiento que llama al procedimiento que sacaba las fotos, y
# muestra en el canvas la imagen cargada. También se encarga de
# configurar el botón ok para que llame a img_write (ver más abajo)
# cuando sea presionado.

proc iface_torimasu {w pict_cmd ok_cmd} {
  set img [eval $pict_cmd]
  $w.c create image 0 0 -anchor nw -image $img
  $w.f.bok configure -command [linsert $ok_cmd end $img]
}

# Procedimiento que a partir de la imagen cargada, escribe en un archivo
# temporal la imagen en formato PNM, la convierte al formato solicitado
# (llamando al programa convert, parte importante de imagemagik;
# apt-get install convert), y borra el temporal.

proc img_write {fname img} {
  $img write $fname.pnm
  exec convert $fname.pnm $fname
  file delete $fname.pnm
  exit
}

# El primer parámetro tendrá el nombre de archivo sobre el cual se
# grabará la imagen. El formato viene explícito en la extensión del
# mismo.

set filename [lindex $argv 0]

# Se crea la interfaz, utilizando tv_torimasu para sacar fotos, e
# img_write para escribirlas en disco.

iface_new "" {tv_torimasu} [list img_write $filename]


Para la segunda parte, el plugin, se crea otro archivo en tcl, esta vez
en el directorio de scripts de xchat. El plugin no precisa demasiada
explicación, ya que lo único que hace es definir una orden /foto, con la
cual se llamará a sacar-foto.tcl, y a menos que el archivo no exista (se
haya cancelado) la moverá con ssh al directorio de fotos en mi servidor
web y llamará a /say para que la URL aparezca en el canal actual.

Nótese también lo simple que resulta generar un nombre aleatorio en
base64.

~/.xchat2/scripts/foto.tcl:


proc sacar_foto {} {
  set idx 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_
  for {set i 0} {$i<8} {incr i} {
    append rand [string index $idx [expr {int(rand()*64)}]]
  }
  catch {exec sacar-foto.tcl /dev/shm/$rand.jpg}
  if {![file exists /dev/shm/$rand.jpg]} return
  if {[catch {
    exec scp -o StrictHostKeyChecking=no -P 443 /dev/shm/$rand.jpg \
                fideo.no-ip.info:/var/www-fideo.no-ip.info/fotos/$rand.jpg
    file delete /dev/shm/$rand.jpg
    /say http://fideo.no-ip.info/fotos/$rand.jpg
  } res]} {
    print $res
  }
}

alias foto {
  sacar_foto
}

---------
Los documentos en este sitio se encuentran licenciados bajo la GFDL.
Ver comentarios: [Hay i comentarios]
Para agregar un comentario: agregue a la URL: ?do=show_comment_form (explicación)