2016-05-19 1 views
0

Donc, j'essaie de comprendre comment la conversion PNG en BMP a réellement lieu. J'ai créé le PNG de 8x8 pixels suivant à l'aide d'un outil en ligne:Comment convertir un fichier PNG en BMP 1 bit

enter image description here

je puis effectué une conversion à l'aide de l'outil ImageMagik dans le terminal OSX:

$ convert -monochrome pic.png pic.bmp

Ensuite, je l'ai fait une hexdump de l'image:

$ hexdump -C pic.bmp 00000000 42 4d 4a 01 00 00 00 00 00 00 8a 00 00 00 7c 00 |BMJ...........|.| 00000010 00 00 08 00 00 00 08 00 00 00 01 00 18 00 00 00 |................| 00000020 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000030 00 00 00 00 00 00 00 00 ff 00 00 ff 00 00 ff 00 |................| 00000040 00 00 00 00 00 ff 42 47 52 73 8f c2 f5 28 51 b8 |......BGRs...(Q.| 00000050 1e 15 1e 85 eb 01 33 33 33 13 66 66 66 26 66 66 |......333.fff&ff| 00000060 66 06 99 99 99 09 3d 0a d7 03 28 5c 8f 32 00 00 |f.....=...(\.2..| 00000070 00 00 00 00 00 00 00 00 00 00 04 00 00 00 00 00 |................| 00000080 00 00 00 00 00 00 00 00 00 00 ff ff ff ff ff ff |................| 00000090 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| * 00000130 ff ff 00 00 00 ff ff ff ff ff ff ff ff ff ff ff |................| 00000140 ff ff ff ff ff ff ff ff ff ff |..........| 0000014a

Ainsi, ob Vivement, nous avons un en-tête BMP de 0x00 - 0x8C. Ensuite, nous avons FF pour les pixels blancs et 00 pour le noir. Tout cela a du sens, mais pas la structure de la sortie. Jusqu'à présent, il semble qu'il y ait un ratio de 3 à 1. 3 octets par pixel. Je suppose que cela signifie noir, blanc, sans couleur?

Je dois bien comprendre pourquoi il y a 3 octets par pixel au lieu de 2. Idéalement, je voudrais un binaire 1 ou 0 pour chaque pixel à la place. Y a-t-il un moyen de faire cela? Et si non, quelqu'un peut-il expliquer la disposition des octets? Plus précisément: Pourquoi les 3 00 à 0x132 - 0x134 et pas le tout début?

Merci

+0

probablement une couleur bmp, ce qui signifie 24 bits par couleur (8bit rouge, 8bit vert, 8bit bleu). Si vous voulez un vrai bitmap B & W, vous devez afficher les options d'en-tête bmp appropriées pour dire que c'est B & W. –

+0

Le format de fichier BMP est bien expliqué sur sa page Wikipedia. Pourquoi ne pas commencer là? Pour un, il vous indique quel octet dans cet en-tête indique la profondeur de bits. – usr2564301

Répondre

1

Je ne sais pas quelle question cela répondra, mais de la Usage docs

IM ne peut pas produire BMP autres de niveaux de profondeur à 8. Cependant, vous pouvez utiliser le traitement de l'image NetPBM ensemble pour effectuer la conversion finale à d'autres niveaux de profondeur (Ce besoin d'au moins une version de Q16 IM) ...

donc, si nous tirons parti NetPBM

$ convert pic.png -depth 1 ppm:- | hexdump 

Ce qui donne (Notez que les valeurs sont 0 & 1, mais vous avez encore un des canaux RVB)

0000000 50 36 0a 38 20 38 0a 31 0a 00 00 00 01 01 01 01 
0000010 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 
* 
00000c0 01 01 01 01 01 01 01 01 01      
00000c9 

donc une solution de contournement mon être aussi simple que

$ convert pic.png -depth 1 ppm:- | pnmdepth 1 | ppm2bmp > pic.bmp 
+0

Ça me donne quelque chose à travailler, merci. – JohnnyStarr