Comment convertir une image en tableau d’octets

Quelqu’un peut-il suggérer comment je peux convertir une image en un tableau d’octets et vice versa?

Si quelqu’un avait des exemples de code pour m’aider, ce serait génial.

Je développe une application WPF et utilise un lecteur de stream.

Exemple de code pour changer une image en un tableau d’octets

public byte[] ImageToByteArray(System.Drawing.Image imageIn) { using (var ms = new MemoryStream()) { imageIn.Save(ms,imageIn.RawFormat); return ms.ToArray(); } } 

C # Image to Byte Array et Byte Array to Image Converter Classe

Pour convertir un object image en byte[] vous pouvez procéder comme suit:

 public static byte[] converterDemo(Image x) { ImageConverter _imageConverter = new ImageConverter(); byte[] xByte = (byte[])_imageConverter.ConvertTo(x, typeof(byte[])); return xByte; } 

Une autre façon d’obtenir le tableau d’octets du chemin de l’image est

 byte[] imgdata = System.IO.File.ReadAllBytes(HttpContext.Current.Server.MapPath(path)); 

essaye ça:

 public byte[] imageToByteArray(System.Drawing.Image imageIn) { MemoryStream ms = new MemoryStream(); imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif); return ms.ToArray(); } public Image byteArrayToImage(byte[] byteArrayIn) { MemoryStream ms = new MemoryStream(byteArrayIn); Image returnImage = Image.FromStream(ms); return returnImage; } 

Vous pouvez utiliser la méthode File.ReadAllBytes() pour lire n’importe quel fichier dans un tableau d’octets. Pour écrire un tableau d’octets dans un fichier, utilisez File.WriteAllBytes() méthode File.WriteAllBytes() .

J’espère que cela t’aides.

Vous pouvez trouver plus d’informations et un exemple de code ici .

Voici ce que j’utilise actuellement. Certaines des autres techniques que j’ai essayées n’étaient pas optimales car elles changeaient la profondeur de bits des pixels (24 bits contre 32 bits) ou ignoraient la résolution de l’image (dpi).

  // ImageConverter object used to convert byte arrays containing JPEG or PNG file images into // Bitmap objects. This is static and only gets instantiated once. private static readonly ImageConverter _imageConverter = new ImageConverter(); 

Image à tableau d’octets:

  ///  /// Method to "convert" an Image object into a byte array, formatted in PNG file format, which /// provides lossless compression. This can be used together with the GetImageFromByteArray() /// method to provide a kind of serialization / deserialization. ///  /// Image object, must be convertable to PNG format /// byte array image of a PNG file containing the image public static byte[] CopyImageToByteArray(Image theImage) { using (MemoryStream memoryStream = new MemoryStream()) { theImage.Save(memoryStream, ImageFormat.Png); return memoryStream.ToArray(); } } 

Tableau d’octets à l’image:

  ///  /// Method that uses the ImageConverter object in .Net Framework to convert a byte array, /// presumably containing a JPEG or PNG file image, into a Bitmap object, which can also be /// used as an Image object. ///  /// byte array containing JPEG or PNG file image or similar /// Bitmap object if it works, else exception is thrown public static Bitmap GetImageFromByteArray(byte[] byteArray) { Bitmap bm = (Bitmap)_imageConverter.ConvertFrom(byteArray); if (bm != null && (bm.HorizontalResolution != (int)bm.HorizontalResolution || bm.VerticalResolution != (int)bm.VerticalResolution)) { // Correct a strange glitch that has been observed in the test program when converting // from a PNG file image created by CopyImageToByteArray() - the dpi value "drifts" // slightly away from the nominal integer value bm.SetResolution((int)(bm.HorizontalResolution + 0.5f), (int)(bm.VerticalResolution + 0.5f)); } return bm; } 

Edit: Pour obtenir l’image à partir d’un fichier jpg ou png, vous devez lire le fichier dans un tableau d’octets à l’aide de File.ReadAllBytes ():

  Bitmap newBitmap = GetImageFromByteArray(File.ReadAllBytes(fileName)); 

Cela évite les problèmes liés à Bitmap qui veulent que le stream source rest ouvert, et certaines solutions de contournement suggèrent que le fichier source rest verrouillé.

Voulez-vous uniquement les pixels ou l’image entière (en-têtes compris) en tant que tableau d’octets?

Pour les pixels: Utilisez la méthode CopyPixels sur Bitmap. Quelque chose comme:

 var bitmap = new BitmapImage(uri); //Pixel array byte[] pixels = new byte[width * height * 4]; //account for ssortingde if necessary and whether the image is 32 bit, 16 bit etc. bitmap.CopyPixels(..size, pixels, fullSsortingde, 0); 

Si vous ne faites pas référence aux imagesBytes pour transporter des octets dans le stream, la méthode ne renverra rien. Assurez-vous de référencer imageBytes = m.ToArray ();

  public static byte[] SerializeImage() { MemoryStream m; ssortingng PicPath = pathToImage"; byte[] imageBytes; using (Image image = Image.FromFile(PicPath)) { using ( m = new MemoryStream()) { image.Save(m, image.RawFormat); imageBytes = new byte[m.Length]; //Very Important imageBytes = m.ToArray(); }//end using }//end using return imageBytes; }//SerializeImage 

Ce code récupère les 100 premières lignes de la table dans SQLSERVER 2012 et enregistre une image par ligne dans un fichier sur le disque local

  public void SavePicture() { SqlConnection con = new SqlConnection("Data Source=localhost;Integrated security=true;database=databasename"); SqlDataAdapter da = new SqlDataAdapter("select top 100 [Name] ,[Picture] From tablename", con); SqlCommandBuilder MyCB = new SqlCommandBuilder(da); DataSet ds = new DataSet("tablename"); byte[] MyData = new byte[0]; da.Fill(ds, "tablename"); DataTable table = ds.Tables["tablename"]; for (int i = 0; i < table.Rows.Count;i++ ) { DataRow myRow; myRow = ds.Tables["tablename"].Rows[i]; MyData = (byte[])myRow["Picture"]; int ArraySize = new int(); ArraySize = MyData.GetUpperBound(0); FileStream fs = new FileStream(@"C:\NewFolder\" + myRow["Name"].ToString() + ".jpg", FileMode.OpenOrCreate, FileAccess.Write); fs.Write(MyData, 0, ArraySize); fs.Close(); } } 

s'il vous plaît noter: Directory avec le nom NewFolder devrait exister dans C: \

Code:

 using System.IO; byte[] img = File.ReadAllBytes(openFileDialog1.FileName);