简体   繁体   English

如何将图像转换为字节数组

[英]How to convert image to byte array

Can anybody suggest how I can convert an image to a byte array and vice versa?任何人都可以建议我如何将图像转换为字节数组,反之亦然?

I'm developing a WPF application and using a stream reader.我正在开发 WPF 应用程序并使用流阅读器。

Sample code to change an image into a byte array将图像更改为字节数组的示例代码

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 and Byte Array to Image Converter Class C# 图像到字节数组和字节数组到图像转换器类

For Converting an Image object to byte[] you can do as follows:要将 Image 对象转换为byte[]您可以执行以下操作:

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

从图像路径获取字节数组的另一种方法是

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

Here's what I'm currently using.这是我目前正在使用的。 Some of the other techniques I've tried have been non-optimal because they changed the bit depth of the pixels (24-bit vs. 32-bit) or ignored the image's resolution (dpi).我尝试过的其他一些技术不是最佳的,因为它们改变了像素的位深度(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();

Image to byte array:图像到字节数组:

  /// <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();
     }
  }

Byte array to Image:字节数组到图像:

  /// <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;
  }

Edit: To get the Image from a jpg or png file you should read the file into a byte array using File.ReadAllBytes():编辑:要从 jpg 或 png 文件中获取图像,您应该使用 File.ReadAllBytes() 将文件读入字节数组:

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

This avoids problems related to Bitmap wanting its source stream to be kept open, and some suggested workarounds to that problem that result in the source file being kept locked.这避免了与位图希望其源流保持打开相关的问题,以及一些建议的解决该问题的方法,这些解决方法导致源文件被保持锁定。

try this:试试这个:

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;
}

You can use File.ReadAllBytes() method to read any file into byte array.您可以使用File.ReadAllBytes()方法将任何文件读入字节数组。 To write byte array into file, just use File.WriteAllBytes() method.要将字节数组写入文件,只需使用File.WriteAllBytes()方法。

Hope this helps.希望这会有所帮助。

You can find more information and sample code here .您可以在此处找到更多信息和示例代码。

Do you only want the pixels or the whole image (including headers) as an byte array?您是否只想要像素或整个图像(包括标题)作为字节数组?

For pixels: Use the CopyPixels method on Bitmap.对于像素: CopyPixels图上使用CopyPixels方法。 Something like:类似的东西:

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); 

If you don't reference the imageBytes to carry bytes in the stream, the method won't return anything.如果您不引用 imageBytes 以在流中携带字节,则该方法将不会返回任何内容。 Make sure you reference imageBytes = m.ToArray();确保您引用 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

Code:代码:

using System.IO;

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

This is Code for converting the image of any type(for example PNG, JPG, JPEG) to byte array这是用于将任何类型的图像(例如 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
    }

To be convert the image to byte array.The code is give below.将图像转换为字节数组。代码如下。

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

To be convert the Byte array to Image.The code is given below.The code is handle A Generic error occurred in GDI+ in Image Save.将字节数组转换为图像。代码如下。代码是处理图像保存A Generic error occurred in GDI+A Generic error occurred in GDI+

public void SaveImage(string base64String, string filepath)
{
    // image convert to base64string is base64String 
    //File path is which path to save the image.
    var bytess = Convert.FromBase64String(base64String);
    using (var imageFile = new FileStream(filepath, FileMode.Create))
    {
        imageFile.Write(bytess, 0, bytess.Length);
        imageFile.Flush();
    }
}

This code retrieves first 100 rows from table in SQLSERVER 2012 and saves a picture per row as a file on local disk此代码从 SQLSERVER 2012 中的表中检索前 100 行,并将每行一张图片保存为本地磁盘上的文件

 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();
               }

    }

please note: Directory with NewFolder name should exist in C:\\请注意:具有NewFolder名称的目录应存在于 C:\\

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM