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

有人能告诉我如何将图像转换为字节数组,反之亦然吗?

我正在开发一个 WPF 应用程序并使用一个流阅读器。

496086 次浏览

将图像更改为字节数组的示例代码

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

C # 图像到字节数组和字节数组到图像转换器类

您只希望像素或整个图像(包括标头)作为一个字节数组?

像素: 使用位图上的 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);

试试这个:

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

可以使用 File.ReadAllBytes()方法将任何文件读入字节数组。要将字节数组写入文件,只需使用 File.WriteAllBytes()方法。

希望这个能帮上忙。

您可以找到更多信息和示例代码 给你

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

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

这是我目前使用的。我尝试过的其他一些技术都不是最佳的,因为它们改变了像素的位深度(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 文件中获取 Image,您应该使用 File 将文件读入一个字节数组。ReadAllBytes () :

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

这避免了与 Bitmap 希望其源代码流保持打开状态相关的问题,一些人还提出了解决这个问题的办法,从而导致源代码文件保持锁定状态。

要将 Image 对象转换为 byte[],可以执行以下操作:

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

此代码从 SQLSERVER2012中的表中检索前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();
}


}

请注意: 具有 新文件夹名称的目录应该存在于 C:

密码:

using System.IO;


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

如果不引用 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

这是用于将任何类型(例如 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
}

要将图像转换为字节数组。

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

要将 Byte 数组转换为 Image 的。代码如下。代码是在图像保存处理 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();
}
}