La taille de l’octet bitmap diffère de la taille du mémoire de rappel BMP

J’essaie d’envoyer une image sur une connexion TCP / IP. Jusqu’à présent, mon programme fonctionne comme il se doit. Mais lors du débogage, j’ai découvert une valeur étrange de mon octet bitmap [].

J’ouvre un bitmap 24 bits et le convertis en 16 bits. Le bitmap est 800×600 donc la longueur d’octet [] doit être 800 * 800 * 2Byte = 960000Byte … Mais mon tableau est 960054 …

D’où viennent les octets supplémentaires?

Console.WriteLine("Bitmap auf 16Bit anpassen...\n"); Rectangle r = new Rectangle(0,0,bitmap_o.Width, bitmap_o.Height); Bitmap bitmap_n = bitmap_o.Clone(r, PixelFormat.Format16bppRgb555); bitmap_n.Save("test2.bmp"); Console.WriteLine("Neue Bitmap-Eigenschaften:"); Console.WriteLine(bitmap_n.Width.ToSsortingng()); Console.WriteLine(bitmap_n.Height.ToSsortingng()); Console.WriteLine(bitmap_n.PixelFormat.ToSsortingng()); byte[] data = new byte[0]; MemoryStream mem_stream = new MemoryStream(); bitmap_n.Save(mem_stream, ImageFormat.Bmp); data = mem_stream.ToArray(); mem_stream.Close(); Console.WriteLine(data.Length.ToSsortingng()); stream.Write(data, 0, 960000); Console.WriteLine("Sending data..."); 

Les octets supplémentaires sont l’en-tête du fichier, qui contient par exemple:

  • Signature de fichier bitmap
  • Dimensions de l’image (taille en pixels)
  • Peu profond
  • Résolution (ppi)

Il peut également y avoir des octets supplémentaires dans les données de pixels. Dans votre cas, 800 pixels sur deux octets représentent chacun 1600 octets par ligne d’parsing. Toutefois, si vous aviez par exemple 145 pixels sur trois octets, chacun créerait 435 octets. est divisible par quatre.

Ref: format de fichier BMP

Il peut y avoir des octets supplémentaires dans le tableau bitmap pour remplir les lignes de balayage en nombres plus agréables. La longueur effective d’une ligne de balayage s’appelle ‘Ssortingde’ et vous pouvez effectuer le test via le champ BitmapData.Ssortingde .

La longueur totale d’un bitmap est calculée comme suit:

 int size1 = bmp1Data.Ssortingde * bmp1Data.Height; 

Vous pouvez consulter une publication qui l’utilise pour créer un tableau pour la méthode LockBits afin d’parsingr une bitmap entière.