Pregunta

Estoy haciendo un trabajo donde estoy descargando programáticamente iconos de los sitios especificados en un documento de OpenSearch y necesito extraer la primera imagen (por ahora) si está en formato ICO. Puedo leer el encabezado del archivo ICO sin problemas y cortar el primer archivo de imagen. Sin embargo, después de leer el Entrada de Wikipedia explicando el formato de archivo Descubrí que, si la imagen está en formato de mapa de bits, entonces el archivo está incompleto (le falta el encabezado). Así que necesito reconstruir este encabezado antes de poder guardar los datos en un archivo, pero tengo un poco de dificultad.

De acuerdo con la Entrada de Wikipedia para formato de archivo BMP, el encabezado tiene 14 bytes de largo y debe contener lo siguiente:

Compensar datos
0x0000    "BM", for our intents and purposes
0x0002    Size of the bitmap file in bytes
0x0006    Dependant on the application creating the file
0x0008    Dependant on the application creating the file
0x000A    Offset of the image data/pixel array

Pensé que el tamaño del archivo de mapa de bits en bytes sería del tamaño de la imagen extraída + los 14 bytes para el encabezado, pero no estoy seguro de qué escribir a 0x0006, 0x0008 y cómo obtener la ubicación de la matriz de píxeles Escribe a 0x000a.

He leído el artículo varias veces, pero debo admitir que mi cabeza está doliendo un poco. Esta es mi primera experiencia en hacer este tipo de cosas. ¿Alguien puede ayudarme a resolver cómo obtener la ubicación de la matriz de píxeles?

¿Fue útil?

Solución

0x0006 y 0x0008 están reservados, simplemente debe poner ceros allí. En cuanto a 0x000A, esa es la posición en la que los datos de imagen reales comienzan en el archivo. Normalmente, el encabezado que tiene aquí es seguido por el encabezado DIB (comenzando en compensación 0x000E) y los primeros cuatro bytes del encabezado DIB son su tamaño. Entonces toma el tamaño del encabezado DIB, agregue su desplazamiento inicial (0x000E) y lo que tienes es la posición en la que comienzan los datos reales: coloque los 0x000A.

Aquí hay datos de ejemplo de un archivo de mapa de bits aleatorio:

42 4D             "BM"
2E 78 08 00       Size of the entire bitmap file (0x8782E meaning 555054 bytes)
00 00             creator1, reserved
00 00             creator2, reserved
36 00 00 00       Image data starts at offset 0x36 because the next 0x28 bytes are DIB header
28 00 00 00       DIB header started and its size is 0x28 (40 bytes)
another 36 bytes
FF FF FF          First pixel of the image (white as it happens)

Si tomas el Favicon en serverfault.com Como ejemplo, tomaría la parte del archivo entre compensación 0x0016 y 0x013E y prepárelo con 42 4D 36 01 00 00 00 00 00 00 36 00 00 00. Que le brinda una especie de archivo de mapa de bits correcto, e IrfanView incluso lo mostrará. Sin embargo, los datos almacenados en archivos ICO y archivos BMP no son los mismos porque los archivos ICO deben almacenar información de transparencia. Es por eso que este favicon tiene tamaño 16x32 de acuerdo con su encabezado DIB en lugar del 16x16 esperado.

De Wikipedia:

Las imágenes con menos de 32 bits de profundidad de color siguen un formato particular: la imagen está codificada como una sola imagen que consiste en una máscara de color (la "máscara Xor") junto con una máscara de opacidad (la "y la máscara"). La máscara XOR debe preceder a la máscara y la máscara dentro de los datos de mapa de bits; Si la imagen se almacena en orden ascendente (que probablemente sea), la máscara XOR se dibujaría debajo de la máscara y la máscara.

En nuestro caso particular, esto significa que a partir de 256 bytes de datos de imagen, los primeros 64 bytes son la máscara Xor, los últimos 64 bytes y la máscara y solo la parte media es nuestra imagen. En nuestro caso particular, puede cambiar los datos del inicio de la imagen (compensación 0x000A) a 0x76 para omitir la máscara Xor. Entonces también cambiarías la altura de la imagen en el encabezado DIB (desplazamiento 0x0016) a 0x10 para asegurarse de que se ignore la máscara y la máscara. Aquí estas manipulaciones le darán un mapa de bits válido, más o menos lo que esperabas. En caso de general, podría ser mejor considerar las máscaras, sin embargo, en lugar de ignorarlas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top