Vamos a programar #106 - Agregando imagenes a archivos FLAC parte 2.
Hola de nuevo a todos, el día de hoy vamos a continuar con mas de los archivos FLAC.
En el post anterior vimos cómo es que esta estructurado la parte que conforma la imagen en un archivo FLAC. Hoy, al igual que en otras ocasiones, antes de escribir el programa en c#, vamos a insertar la imagen "a mano" solo usando un editor Hexadecimal; el que siempre uso es XVI32 que puedes descargar de su sitio oficial. Cómo archivo de prueba voy a usar una canción en formato FLAC, para que sea sencillo seguir los pasos, te recomiendo usar el mismo archivo que puedes descargar aquí. Pero al igual que las otras canciones, si no posees el original, debes de eliminarlo al terminar de hacer las pruebas. La caratula del álbum también la puedes descargar de aquí.Una vez todo listo, procederemos a abrir el archivo FLAC con XVI32. Hay que tomar en cuenta que a partir de este momento, cuando escribamos un numero en decimal simplemente será el numero, cuando hagamos referencia a un numero en binario, será bxxxxxxxx y en hexadecimal sera 0xXX
Una vez abierto, vamos a desplazarnos por el archivo. Si hacemos memoria, los primeros cuatro bytes, corresponden al identificador del archivo que es "fLaC" inmediatamente después de este, viene el bloque con la información del stream. este tiene un tamaño fijo de 34 bytes (en bits son: 16+16+24+24+20+3+5+36+128 = 272 bits = 34 bytes), que es lo que nos indica el byte en la dirección 0x05 hasta 0x07 que es la secuencia 0x00, 0x00, 0x22 que al convertirlo a decimal nos da treinta y cuatro, hay que recordar que en el tamaño no se incluye el encabezado. En XVI32, nos podemos desplazar cierto numero de bytes. Al terminar de leer el encabezado del bloque con la información del stream, deberíamos de estar en la dirección 0x07 posicionamos el cursor en el byte siguiente y presionamos la tecla de "control" y la tecla "b", eso le indicará a XVI32 que estamos marcando el inicio de lo que queremos seleccionar, luego vamos al menú "edit>>block <n> chars" e introducimos tantos bytes cómo nos dijo el encabezado del bloque, en este caso fueron treinta y cuatro.
Con esto estará resaltado todo el bloque. Esto solo lo hacemos con el fin de que todo resulte mas claro, pero este bloque no lo vamos a modificar, asi que avanzamos al siguiente.
![]() | ||
| Se puede apreciar todo el bloque. |
Inmediatamente después de la selección, viene el siguiente bloque. Por ahora los que nos interesan son o el bloque de la imagen (aunque en este ejemplo no existe) o el bloque de "padding". De cualquier forma vamos a leer los bloques hasta que encontremos alguno. Para eso simplemente repetimos el paso anterior.
En nuestra secuencia, leemos 0x04, 0x00, 0x01 y 0x58 (el tamaño es 0x0158) que al convertirlo a decimal nos da 344, el primer byte nos dice que este es el bloque "Vorbis Comment", nuevamente marcamos esa cantidad de bytes después del encabezado.
Algo importante que debemos de recordar, es que debemos de repetir todo hasta que encontremos el marcador del ultimo bloque. Si continuamos leyendo, tenemos la secuencia 0x81, 0x00, 0x1E y 0xD0, esta es relevante porque al convertir el primer byte a binario, nos da b10000001 y justamente el primer bit (de izquierda a derecha) nos dice que este es el último bloque y además que es del tipo "padding" y que tiene una longitud de 7,888 bytes, procedemos a marcarlos.
Con esto ya tenemos toda la información que necesitamos. antes que nada, necesitamos ver si el tamaño reservado (padding) es suficiente para nuestra imagen, si descargaste la imagen al inicio, estas deben de ser sus propiedades.
Para poder inscrustar la imagen necesitamos un espacio 180,677 bytes mas el encabezado, el espacio que tenemos es de 7,888 y claramente es insuficiente, por lo que vamos a reemplazar el bloque en su totalidad.
Preparando la imagen.
Vamos a usar Xvi32 para crear el bloque completo. Primero preparamos el bit que describe el bloque. EN este caso, va a ser el ultimo bloque, pero ademas sera del tipo "PICTURE", el primer bit es b1, seguido de la descripción que es b110, al unirlos para formar el byte tenemos b10000110 que es 134 en decimal o 0x86. En XVI32 podemos insertar directamente los dígitos hexadecimales en el panel de lado izquierdo, si queremos insertar 134 decimal simplemente lo convertimos a hexadecimal y lo escribimos tal cual. Antes de continuar, guardamos lo que llevamos con el nombre de "Picture block.bin".
para calcular el tamaño total, primero vamos a construir al bloque APIC.
- Tipo de imagen por ahora usaremos 0x03 (cubierta frontal del disco) usa 4 bytes.
- 0x00, 0x00, 0x00, 0x03, en XVI32 vamos al menú "Edit>>Inser string"
- El tamaño del tipo MIME , usaremos "image/jpeg" que tiene una longitud de 10 bytes.
- 0x00, 0x00, 0x00, 0x0A.
- La cadena de texto "image/jpeg".
- Usando el comando insertar escribimos literal image/jpeg.
- El tamaño de la descripción , usaremos la misma secuencia "image/jpeg" que tiene una longitud de 10 bytes.
- 0x00, 0x00, 0x00, 0x0A.
- La cadena de texto "image/jpeg".
- Usando el comando insertar escribimos literal image/jpeg.
- El ancho de la imagen
- 0x00, 0x00, 0x00, 0x00
- El alto de la imagen
- 0x00, 0x00, 0x00, 0x00
- La profundidad de color
- 0x00, 0x00, 0x00, 0x00
- El indice de colores
- 0x00, 0x00, 0x00, 0x00
- El tamaño de la imagen en bytes de la imagen
- la imagen pesa 180,677 bytes que es 0x02C1C5 que queda para insertarlo cómo 0x00, 0x02, 0xC1, 0xC5
- Los datos de la imagen.
- Abrimos la imagen con XVI32, seleccionamos todos los bytes, los copiamos y los pegamos inmediatamente después de nuestro último byte.
![]() | |
| Así debería de lucir nuestra secuencia antes de insertar los datos de la imagen. |
Guardamos el archivo como APIC.bin e inspeccionamos sus propiedades para obtener el tamaño.
Volvemos a abrir "Picture block.bin" e insertamos el tamaño de "APIC.bin", en este caso 180,729 es 0x02C1F9 y en la secuencia es: 0x02, 0xC1, 0xF9. Una vez escrito, Abrimos "APIC.bin" y seleccionamos todos los datos, los copiamos y pegamos en "picture block.bin" inmediatamente después de la secuencia actual.
Con esto ya tenemos todo listo para unir las partes.Para eso, seleccionaremos y copiaremos todos los datos previos al bloque que vamos a sustituir (en nuestro archivo FLAC). Los copiamos y pegamos, luego el bloque que creamos y finalmente el resto del archivo FLAC.
Para simplifica un tanto las cosas, y si quieres ir directo al grano, de nuestro archivo original, primero seleccionaremos los primeros 390 bytes, los copiamos y los pegamos en un nuevo archivo, luego abrimos "picture block.bin", seleccionamos todo y lo insertamos en el archivo que creamos, luego en nuestro archivo original, nos desplazamos a la posición 8,282, usando el comando "go to" en el menú "address" y de ahí seleccionamos todo el resto del archivo, lo copiamos y lo insertamos en el nuevo, si todo fue bien deberíamos de tener nuestro archivo FLAC con su caratula.
Al inspeccionarlo tenemos que todo fue como es debido.
Y bien, por ahora es todo, el objetivo de hacer los pasos a mano, es para ayudar a comprender que es lo que el programa va a hacer. En el siguiente post escribiremos el código en C# que nos ayudara.
Los leo luego.














Para cuándo el programa, me interesa mucho
ResponderBorrarSale en los próximos días, gracias por comentar
Borrar