Question

Je fais un travail où je télécharge des icônes de programme sites spécifiés dans un document OpenSearch et je dois extraire la première image (pour l'instant) si elle est au format ICO. Je suis capable de lire l'en-tête de fichier ICO sans problème et découper le premier fichier d'image. Cependant, après avoir lu l'entrée Wikipédia expliquant le format de fichier que j'ai découvert que, si l'image est au format bitmap, le fichier est incomplet (il manque l'en-tête). Donc, je dois reconstruire cet en-tête avant que je puisse enregistrer les données dans un fichier, mais je vais avoir un peu de difficulté.

Selon le entrée Wikipedia pour le format de fichier BMP , l'en-tête est de 14 octets et devrait contenir les éléments suivants:

Offset    Data
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

Je me suis dit que la taille du fichier bitmap en octets serait la taille de l'image extraite + 14 octets pour l'en-tête, mais je ne suis pas sûr de quoi écrire à 0x0006, 0x0008 et comment obtenir l'emplacement du matrice de pixels à écrire à 0x000A.

J'ai lu l'article à quelques reprises, mais je dois avouer que ma tête est mal un peu. Ceci est ma première expérience à faire ce genre de chose. aider quelqu'un peut me trouver comment obtenir l'emplacement de matrice de pixels?

Était-ce utile?

La solution

0x0006 et 0x0008 sont réservés, vous devez simplement mettre des zéros là. Quant à 0x000A, c'est la position à laquelle les données d'image réelle commence dans le fichier. Normalement, l'en-tête que vous avez ici est suivi par l'en-tête de DIB (à partir de 0x000E offset) et les quatre premiers octets de l'en-tête DIB sont sa taille. Vous prenez donc la taille de l'en-tête de DIB, ajoutez son (0x000E) à partir de décalage et ce que vous avez est la position où les données réelles commence -. Mis à 0x000A que la position

Voici par exemple les données d'un fichier bitmap aléatoire:

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 vous prenez le favicon sur serverfault.com à titre d'exemple, vous prendriez la partie du fichier entre 0x0016 offset et 0x013E et préfixer avec des 42 4D 36 01 00 00 00 00 00 00 36 00 00 00. Ce qui vous donne une sorte de fichier bitmap correct - et IrfanView affichera même pas. Toutefois, les données stockées dans des fichiers ICO et fichiers BMP est pas tout à fait la même chose parce que les fichiers ICO doivent informations de transparence du magasin. Ce qui est la raison pour laquelle cette favicon a une taille 16x32 selon son en-tête de DIB plutôt que le 16x16 attendu.

De Wikipedia :

Images de moins de 32 bits de profondeur de couleur ont un format particulier: l'image est codée comme une image unique se composant d'un masque de couleurs (le « masque XOR ») avec un masque d'opacité (le « et le masque »). Le masque XOR doit précéder le masque et à l'intérieur des données bitmap; si l'image est stockée pour bottom-up (ce qui est le plus probable), le masque XOR serait tiré au-dessous du masque ET.

Dans notre cas particulier, cela signifie que de 256 octets de données d'image les 64 premiers octets sont le masque XOR, le 64 derniers octets du masque ET et que la partie médiane est notre image. Dans notre cas particulier, vous pouvez changer début de données d'image (0x000A offset) à 0x76 sauter le masque XOR. Ensuite, vous aussi changer la hauteur de l'image dans l'en-tête de DIB (0x0016 offset) à 0x10 pour vous assurer que le masque et est ignoré. Ici, ces manipulations vous donneront une image bitmap valide, un peu comme ce que vous attendiez. Dans le cas général, il pourrait être préférable de considérer les masques mais plutôt que de les ignorer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top