 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Vie 07 Dic, 2007 3:59 pm Asunto: Propiedades .swf |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Sab 08 Dic, 2007 9:47 am Asunto: |
|
|
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 |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Sab 08 Dic, 2007 12:43 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Sab 08 Dic, 2007 3:19 pm Asunto: |
|
|
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 |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Sab 08 Dic, 2007 5:36 pm Asunto: |
|
|
Muchísimas gracias campeón, ahora si, todo OK. Ya me sale el mensajito con las dimensiones originales del archivo swf.
Eres un artista . _________________ ¡ADELANTE CON ESTE SUPER FORO! |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|