如何从字节数组创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"); }