2016-10-03 1 views
-1

J'ai un programme pour combiner des fichiers graphiques dans une icône. Les tailles incluent 16,24,32,48,256 32bit. Ceux-ci utilisent PNG et fonctionne. J'ai l'en-tête correct et la liste d'enregistrement de répertoire/index.Enregistrer BMP dans le fichier d'icônes

Cependant, pour 8 bits j'utilise BMP avec les 14 premiers octets de l'en-tête d'un BMP enlevé. Cette partie du fichier d'icône ne fonctionne pas. Après avoir regardé une icône MS, ils ont de nouveau stocké BMP avec l'en-tête de 14 octets supprimé. En regardant leurs données BMP, ils ont le deuxième en-tête comme je le fais, mais pour 16x16 le deuxième en-tête (BITMAPINFOHEADER) dit 16x32. Les coutures BMP doivent être deux fois la largeur. Pourquoi? L'image est-elle deux fois plus large avec un masque ou quelque chose?

Voici mon code: (image Note est 32bit bitmap 32x32 lorsqu'il est passé.)

using (Bitmap imageAsBitmap = new Bitmap(image)) 
{ 
    int colorCount = 0; 
    using (Bitmap bitmap = imageAsBitmap.ColourReduction256(out colorCount)) 
    { 
     byte[] imageBytes = new byte[] { }; 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); 
      imageBytes = ms.ToArray(); 
     } 
     byte[] data = new byte[] { }; 
     Array.Resize(ref data, imageBytes.Length - 14); 
     Array.Copy(imageBytes, 14, data, 0, data.Length); 
     enteries.Add(new IconEntry(data, image.Width, image.Height, 8)); 
    } 
} 
+0

Le 'Array.Resize' semble inutile. Vous pouvez simplement déclarer les données comme 'new byte [imageBytes.Length - 14]'. – Abion47

+0

@ Abion47 Essayez c'est un peu une habitude parce que j'ai fait beaucoup de comms où la taille n'est pas connue mais dans ce cas oui. Je pourrais modifier cette partie pour la rendre plus lisible. Merci. – James

Répondre

1

Oui, vous avez raison:

images avec moins de 32 bits de profondeur de couleur suivent un particulier format suivant: l'image est codée comme une image unique consistant en une couleur masque (le « masque XOR ») avec un masque d'opacité (le « ET masque ») [..]

Quels sont les résultats dans:

[..] les masques doivent être chacun des mêmes dimensions et la hauteur spécifiée dans l'en-tête BMP doivent être exactement deux fois la hauteur spécifiée dans la structure ICONDIRENTRY

Jetez un coup d'oeil ici: https://en.wikipedia.org/wiki/ICO_(file_format)

+0

Merci. Je ne suis pas sûr que vous savez comment ajouter le masque XOR à un objet Bitmap, n'est-ce pas? C'est 1bpp où comme l'image elle-même est 8bpp. – James

+0

Tous triés maintenant! Phew! – James

+0

Je l'ai fait: Propre en-tête DIB avec double hauteur, ajouter une palette de bitmap et tableau de couleur, puis masque qui est essentiellement 1 bit par pixel de données brutes (padded) selon calc sur la page Web. – James