Как преобразовать изображение в байтовый массив - PullRequest
92 голосов
/ 27 сентября 2010

Кто-нибудь может подсказать, как я могу преобразовать изображение в байтовый массив и наоборот?

Если у кого-нибудь есть примеры кода, которые могут мне помочь, это было бы здорово.

Я занимаюсь разработкой приложения WPF и использую потоковую программу чтения.

Ответы [ 11 ]

125 голосов
/ 27 сентября 2010

Пример кода для преобразования изображения в байтовый массив

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

C # Изображение в байтовый массив и байтовый массив в класс преобразователя изображений

45 голосов
/ 06 июня 2013

Для преобразования объекта Image в byte[] вы можете сделать следующее:

public static byte[] converterDemo(Image x)
{
    ImageConverter _imageConverter = new ImageConverter();
    byte[] xByte = (byte[])_imageConverter.ConvertTo(x, typeof(byte[]));
    return xByte;
}
25 голосов
/ 11 мая 2012

Другой способ получить байтовый массив из пути к изображению -

byte[] imgdata = System.IO.File.ReadAllBytes(HttpContext.Current.Server.MapPath(path));
16 голосов
/ 27 сентября 2010

попробуйте это:

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;
}
13 голосов
/ 27 сентября 2010

Вы можете использовать метод File.ReadAllBytes() для чтения любого файла в байтовый массив. Чтобы записать байтовый массив в файл, просто используйте метод File.WriteAllBytes().

Надеюсь, это поможет.

Вы можете найти более подробную информацию и образец кода здесь .

12 голосов
/ 16 мая 2013

Вот что я сейчас использую.Некоторые из других техник, которые я пробовал, были неоптимальными, потому что они изменяли битовую глубину пикселей (24-битный или 32-битный) или игнорировали разрешение изображения (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();

Массив изображения в байты:

  /// <summary>
  /// 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. 
  /// </summary>
  /// <param name="theImage">Image object, must be convertable to PNG format</param>
  /// <returns>byte array image of a PNG file containing the image</returns>
  public static byte[] CopyImageToByteArray(Image theImage)
  {
     using (MemoryStream memoryStream = new MemoryStream())
     {
        theImage.Save(memoryStream, ImageFormat.Png);
        return memoryStream.ToArray();
     }
  }

Массив байтов в изображение:

  /// <summary>
  /// 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.
  /// </summary>
  /// <param name="byteArray">byte array containing JPEG or PNG file image or similar</param>
  /// <returns>Bitmap object if it works, else exception is thrown</returns>
  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;
  }

Редактирование: чтобы получить изображение из файла jpg или png, необходимо прочитать файл в байтовый массивusing File.ReadAllBytes ():

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

Это позволяет избежать проблем, связанных с растровым изображением, желающим, чтобы его исходный поток оставался открытым, и некоторых предлагаемых решений этой проблемы, которые приводят к блокировке исходного файла.

5 голосов
/ 27 сентября 2010

Вы хотите, чтобы только пиксели или все изображение (включая заголовки) представляли собой байтовый массив?

Для пикселей: используйте метод CopyPixels на растровом изображении. Что-то вроде:

var bitmap = new BitmapImage(uri);

//Pixel array
byte[] pixels = new byte[width * height * 4]; //account for stride if necessary and whether the image is 32 bit, 16 bit etc.

bitmap.CopyPixels(..size, pixels, fullStride, 0); 
3 голосов
/ 09 мая 2017

Если вы не ссылаетесь на imageBytes для переноса байтов в потоке, метод ничего не вернет. Убедитесь, что вы ссылаетесь на imageBytes = m.ToArray ();

    public static byte[] SerializeImage() {
        MemoryStream m;
        string 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
2 голосов
/ 09 января 2017

Код:

using System.IO;

byte[] img = File.ReadAllBytes(openFileDialog1.FileName);
0 голосов
/ 22 июня 2019

Это код для преобразования изображения любого типа (например, PNG, JPG, JPEG) в байтовый массив

public static byte[] imageConversion(string imageName){            


            //Initialize a file stream to read the image file
            FileStream fs = new FileStream(imageName, FileMode.Open, FileAccess.Read);

            //Initialize a byte array with size of stream
            byte[] imgByteArr = new byte[fs.Length];

            //Read data from the file stream and put into the byte array
            fs.Read(imgByteArr, 0, Convert.ToInt32(fs.Length));

            //Close a file stream
            fs.Close();

            return imageByteArr
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...