SWF2JPG en Linux

Bueno, realmente esta receta sirve para cualquier plataforma en la que funcionen Gnash y scrot (bonito nombre, LMAO! :-D).

El caso es que ayer me pasé toda la tarde buscando una solución decente para pasar SWFs (ShockWave Flash) a cualquier formato de imagen. Google está repleto de miles de programas cutre-shareware que no funcionan con Wine y la única orientación que veía en los foros de ayuda era usar las swftools, que son geniales, pero no hacen lo que necesitaba (renderizar una animación SWF y sacar un pantallazo de la misma).

Así que pensé: en UNIX se sigue el principio KISS (Keep It Simple, Stupid), cada aplicación pretende hacer pocas cosas y hacerlas bien. Tenemos una aplicación que reproduce SWF desde la línea de comandos y otra que saca pantallazos desde la línea de comandos. Las juntamos con un poco de pegamento shell script y arreglado 🙂

El resultado es un script que hace lo que promete, aunque tiene algunas limitaciones importantes:

  1. Tarda 1 segundo por animación SWF (no es muy lento, pero tampoco es que sea una maravilla).
  2. No te permite hacer nada más con el ordenador mientras se está utilizando (es un segundo por SWF, pero si son muchas… welcome back to the batch-world!!).
  3. Las imágenes generadas tienen la misma resolución que tu escritorio. Si las quieres en otra resolución, cambia la de tu escritorio 😀

Las limitaciones están causadas por el método troglodita para extraer el pantallazo. El script básicamente lanza la animación en pantalla completa, saca el pantallazo y mata el reproductor Flash. Ya sé que no es profesional, pero funciona O:-)

Aquí tenéis el código, quizá a alguien le sea de ayuda:

#!/bin/sh

GNASH="/usr/bin/gtk-gnash"
SCROT="/usr/bin/scrot"
OUTPUTFORMAT="jpg"

if [ $# -ne 1 ]
then
  echo "error, usage: $(basename $0) file.swf"
  exit 1
else
  $GNASH --fullscreen $1 &
  GNASHPID=$!
  $SCROT -d 1 $1.$OUTPUTFORMAT
  kill $GNASHPID
fi

Como podéis observar, es necesario indicar las rutas a Gnash y scrot para que funcione. Si queréis un SWF2PNG o similares, basta con cambiar el OUTPUTFORMAT.

Happy hacking 😉

13 pensamientos en “SWF2JPG en Linux

  1. stenyak

    Interesante idea.

    Molaria integrar esto con flashblock… se usa la url de cada objeto flash como identificador de imagen preview en algun server (imageshack, archive.org, o algo asin):
    Si la imagen ya existe, se usa como reemplazo del flash hasta q el usuario le haga click (q es cuando linux le entregaría un core al plugin de flash para q lo fría a gusto).
    Si la imagen no existe, se carga, se le saca pantallazo y se sube al susodicho server. Pero de forma transparente al usuario final, q solamente vera la imagen clickable de preview 😀

    Responder
  2. txipi

    @stenyak: Pues sí que molaría algo así. Quizá en lugar de usar scrot para la captura, que es un poco limitadito, se podría tirar de “import” de Imagemagick, que permite hacer capturas más ajustadas (capturar solamente una ventana o solamente una porción de la pantalla, etc.) 🙂

    Responder
  3. Alfredo Beaumont

    @txipi ksnapshot también permite las opciones de ImageMagick que comentas… y asumo que probablemente ofrezca una interfaz dbus que te permitirá gestionarlo de forma bastante amigable desde línea de comandos.

    Responder
    1. aklis

      (si llego a tiempo, juntalo con el otro comentario)

      O como poco, abrirse otras X (mítico X :2 y xterm –display :2 ) y dejar ahi el proceso…

      Responder
  4. grajea

    Aunque este post es de hace mucho … lo he encontrado de casualidad hoy.

    Yo hago algo así con Xvfb y xwd
    ejemplo:
    ….
    Xvfb :2 -fbdir /tmp -nolisten inet6 & 2>/dev/null
    # tiempo que queremos esperar
    sleep 10
    # comandos para lanzar la aplicación a pantalla completa
    # por ejemplo, la web de bizkaimove
    DISPLAY=:2.0 firefox -no-remote http://www.bizkaia.net/bizkaimove & 2>/dev/null
    # tiempo que queremos esperar
    sleep 10
    xwd -display :2.0 -root -out $OUTPUT_DIR/shot.xwd
    # …. conversiones de formato, tamaño etc …

    Asi no es necesario que veas en pantalla como se van capturando, puedes seguir trabajando en el mismo pc.

    Responder
  5. Pingback: Bajar presentaciones no disponibles en Slideshare | LIBROS GRATIS PDF

  6. Pingback: Download not available on Slideshare presentations | SQUADOWNLOAD

  7. rusadir

    Gracias, me fue de mucha utilidad. Aunque no sabía como crear el archivo y luego ejecutarlo, busqué por otro lado y lo conseguí.

    Para obtener mayor resolución en el jpg obtenido con tu proceso, roté el monitor 90º y como los swf que quería convertir eran formato DIN-A4 y así obtuve un mayor tamaño.

    Responder
  8. rusadir

    Bueno, este post es de hace bastante tiempo, pero me veo en la obligación de añadir una variante que realiza lo mismo que tú propones con tu script pero a mayor resolución y sin tener que andar capturando pantallas.

    El trabajo es de @rubentrf y de @pardiml, y se basa en el uso de las swftools (que yo sepa sólo disponibles para linux). Una de esas tools se llama swfrender y además tiene un parámetro que es -X que permite especificar el ancho de la imagen que queremos obtener. También se puede especificar el alto con -Y, pero el que programó esta aplicación tuvo en cuenta que si pasas un solo parámetro el otro se ajustará para conservar el aspecto.

    En el ejemplo se pone una resolución de 1200 para el ancho. si se varía ese número, cambia la resolución y el tamaño de salida de imagen.

    La fuente para la ‘undocumented feature’ es http://stackoverflow.com/questions/2988823/render-flash-swf-frame-as-image-pdf-png-jpg

    El script, con instrucciones incluidas es éste:

    #!/bin/bash

    #Requisitos:
    ##Añadir repositorio ppa: sudo add-apt-repository ppa:guilhem-fr/swftools
    ##Actualizar: sudo apt-get update
    ##Instalar: sudo apt-get install swftools

    #Convierte de ‘swf’ a ‘png’
    #Argumento: Directorio a partir del cual busca los archivos con extensión swf y los convierte
    #Entrada: Todos los archivos swf encontrados en el directorio pasado como argumento y sus subdirectorios
    #Salida: Archivos png con el volcado del archivo swf. No es captura de pantalla, por lo que sale sin bordes y sin ajustado al máximo.

    #ejemplo llamada: ./swf_png /home/pardi/educacion_publica_y_de_calidad_para_todos

    for line in $(find $1 -name ‘*.swf’); do
    swfrender ${line} -X 1200 -o ${line}.png

    done

    La aplicación devuelve imágenes png que fácilmente se pueden imprimir en un único pdf con otras aplicaciones.

    Espero que os sea útil. A mi me lo fue.

    Responder
  9. Pingback: BAJAR PRESENTACIONES SLIDESHARE | Servicios Multiples ACMe

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *