Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Propiedades .swf

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Propiedades .swf Responder citando

Hola a todos. Tengo un programa al que he llamado "cocarroy" y se trata de un editor para código HTML (páginas web). Lo que deseo ahora es actualizarlo y añadirle la posibilidad de agregar código para reproducir archivos .swf, dicho código lo conozco ya, lo que deseo conocer es el ancho y alto originales de la animación antes de insertar el código. ¿Alguien conoce algún modo de conocer esos dos datos antes de insertar el código? Gracias.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Las dimensiones se encuentran desde el noveno byte del archivo del siguiente modo:
Código:

..BYTE9   BYTE10   BYTE11   BYTE12   BYTE13   BYTE14   BYTE15   BYTE16 
-------- -------- -------- -------- -------- -------- -------- --------
   68h      00h      1Fh      00h      00h      01h      A0h      00h
01101000 00000000 00011111 01000000 00000000 00000001 10010000 00000000
^---^^-------------^^------------^^-------------^^-------------^
  |         |              |             |              |
nBits      minX           maxX          minY           maxY
(=13)      (=0)          (=4000)        (=0)          (=800)

nBits - ocupa siempre 5 bits y nos dice cuantos bits tendra
        cada uno de los 4 campos que nos indican las dimensiones.
        En el ejemplo 01101 = 13 bits.

 * Las dimensiones estan en twips (1 píxel = 20 twips).
 En el ejemplo maxX = 0111110100000 = 4000 twips / 20 = 200 pixels.
               maxY = 0001100100000 =  800 twips / 20 =  40 pixels.

Especificaciones más detalladas en:
http://www.half-serious.com/swf/format/

Con esta función puedes extraer las dimensiones:
Código:
//Añadimos: #include<memory>
TRect GetSwfRect(String fileName)
{
    struct Local {
        static DWORD GetBits(BYTE* buffer, DWORD pos, DWORD count)
        {
            DWORD result = 0;
            for (DWORD loop = pos; loop < pos + count; loop++) {
                result += ((((buffer[loop / 8])
                    >> (7 - (loop % 8))) & 0x01)
                    << (count - (loop - pos) - 1));
            }
            return result;
        }
        static TRect GetRect(BYTE* buffer)
        {
            TRect r(0, 0, 0, 0);
            int bits = Local::GetBits(buffer, 0, 5);
            r.Left   = Local::GetBits(buffer, 5, bits) / 20;
            r.Right  = Local::GetBits(buffer, 5 + bits, bits) / 20;
            r.Top    = Local::GetBits(buffer, 5 + (bits * 2), bits) / 20;
            r.Bottom = Local::GetBits(buffer, 5 + (bits * 3), bits) / 20;
            return r;
        }
    };

    const WORD openMode = fmOpenRead |fmShareDenyNone;
    std::auto_ptr<TFileStream> fs(new TFileStream(fileName, openMode));
    TRect r(0, 0, 0, 0);
    char hdr1[8] = "";
    char hdr2[128] = "";
    fs->Read(hdr1, 8);

    if (!strnicmp(hdr1, "FWS", 3)) {
        fs->Read(hdr2, 17);
        r = Local::GetRect(hdr2);
    }
    else if (!strnicmp(hdr1, "CWS", 3)) {
        throw Exception("Flash comprimido, no soportado por este ejemplo");

        //--- Si usamos zlib podemos descomprimirlo con lo siguiente:
        //char bufferOut[256] = "";
        //fs->Read(hdr2, sizeof(hdr2));
        //DWORD len = sizeof(bufferOut);
        //uncompress(bufferOut, &len, hdr2, sizeof(hdr2));
        //r = Local::GetRect(bufferOut);
    }
    else
        throw Exception("No es un archivo de flash");

    return r;
}

Y para usarla:
    TRect r = GetSwfRect("d:\\prueba.swf");
    ShowMessage(String().sprintf("Ancho=%d, Alto=%d", r.Width(), r.Height()));
  
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias _Leo por responderme, tu código como siempre es una pasada pero me entra en el apartado de que los archivos que intento abrir están comprimidos entonces descomento lo que tu me pones comentado y me lanza un error diciendo que no reconoce la función uncompress(bufferOut, &len, hdr2, sizeof(hdr2));
He buscado en la ayuda del builder y sólo he encontrado uncompressed pero dice algo que es únicamente para avis.
Me podrias explicar un poco si hay que declarar la función antes en algún otro sitio como por ejemplo en el archivo .h.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Tendrías que usar la librería zlib (http://www.zlib.net), la tienes disponible en forma de .dll o bien el código fuente para enlazarlo directamente, etc..

Otra forma es descargándote los archivos "unzipx.cpp" y "unzipx.h" de:

http://www.telefonica.net/web/ljfg/temp/unzipx.zip

Y simplemente añadir a tu proyecto el archivo "unzipx.cpp" y añadir la cabecera "unzipx.h" en el modulo donde vayas a hacer uso de esta función. No te olvides de quitar la línea del "throw.."

(Los archivos "unzipx.cpp" y "unzipx.h" son versiones con algunas pequeñas modificaciones, de los extraídos del siguiente artículo:
http://www.codeproject.com/KB/files/zip_utils.aspx)
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchísimas gracias campeón, ahora si, todo OK. Ya me sale el mensajito con las dimensiones originales del archivo swf.
Eres un artista Very Happy .
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.