如何从字节数组创build位图?

我search了关于字节数组的所有问题,但是我总是失败。 我从来没有编码C#我在这方面是新的。 你能帮我怎么从字节数组中创build图像文件。

这是我的函数,它存储字节数组名为imageData

 public void imageReady( byte[] imageData, int fWidth, int fHeight)) 

您需要将这些bytes存入MemoryStream

 Bitmap bmp; using (var ms = new MemoryStream(imageData)) { bmp = new Bitmap(ms); } 

这使用Bitmap(Stream stream)构造函数重载。

更新:请记住,根据文档以及我一直在阅读的源代码,这些条件将引发一个ArgumentException

 stream does not contain image data or is null. -or- stream contains a PNG image file with a single dimension greater than 65,535 pixels. 

伙计们,谢谢你的帮助。 我认为所有这些答案都适用。 不过,我认为我的字节数组包含原始字节。 这就是为什么所有这些解决scheme都不适合我的代码。

不过,我find了解决scheme。 也许这个解决scheme可以帮助其他有我的问题的编码人员。

 static byte[] PadLines(byte[] bytes, int rows, int columns) { int currentStride = columns; // 3 int newStride = columns; // 4 byte[] newBytes = new byte[newStride * rows]; for (int i = 0; i < rows; i++) Buffer.BlockCopy(bytes, currentStride * i, newBytes, newStride * i, currentStride); return newBytes; } int columns = imageWidth; int rows = imageHeight; int stride = columns; byte[] newbytes = PadLines(imageData, rows, columns); Bitmap im = new Bitmap(columns, rows, stride, PixelFormat.Format8bppIndexed, Marshal.UnsafeAddrOfPinnedArrayElement(newbytes, 0)); im.Save("C:\\Users\\musa\\Documents\\Hobby\\image21.bmp"); 

此解决scheme适用于8位256 bpp(Format8bppIndexed)。 如果你的图像有另一种格式,你应该改变PixelFormat

现在有一个颜色的问题。 只要我解决了这个问题,我会为其他用户编辑我的答案。

* PS =我不确定步幅值,但对于8位,它应该等于列。

此function也适用于我。此function将8位灰度图像复制到32位布局。

 public void SaveBitmap(string fileName, int width, int height, byte[] imageData) { byte[] data = new byte[width * height * 4]; int o = 0; for (int i = 0; i < width * height; i++) { byte value = imageData[i]; data[o++] = value; data[o++] = value; data[o++] = value; data[o++] = 0; } unsafe { fixed (byte* ptr = data) { using (Bitmap image = new Bitmap(width, height, width * 4, PixelFormat.Format32bppRgb, new IntPtr(ptr))) { image.Save(Path.ChangeExtension(fileName, ".jpg")); } } } } 

可以像以下一样简单:

 var ms = new MemoryStream(imageData); System.Drawing.Image image = Image.FromStream(ms); image.Save("c:\\image.jpg"); 

testing一下:

 byte[] imageData; // Create the byte array. var originalImage = Image.FromFile(@"C:\original.jpg"); using (var ms = new MemoryStream()) { originalImage.Save(ms, ImageFormat.Jpeg); imageData = ms.ToArray(); } // Convert back to image. using (var ms = new MemoryStream(imageData)) { Image image = Image.FromStream(ms); image.Save(@"C:\newImage.jpg"); }