我有一個來自相機的ByteArray,它只是一個流,沒有位圖頭。添加一個位圖頭到一個字節數組然後創建一個位圖文件
我已經搜索了一個演示,但他們都在C++中。
我嘗試添加一個bitmapheader到我的代碼,但拋出了一個ParameterException。如何從ByteArray創建位圖文件?
我有一個來自相機的ByteArray,它只是一個流,沒有位圖頭。添加一個位圖頭到一個字節數組然後創建一個位圖文件
我已經搜索了一個演示,但他們都在C++中。
我嘗試添加一個bitmapheader到我的代碼,但拋出了一個ParameterException。如何從ByteArray創建位圖文件?
使用System.Drawing.Bitmap類
這將工作
...
using System;
using System.IO;
using System.Drawing;
...
public Image ByteArrayToImage(byte[] byteArrayIn)
{
MemoryStream ms = new MemoryStream(byteArrayIn);
Image img = Image.FromStream(ms);
return img;
}
您不能直接使用沒有位圖的原始數據創建位圖類阿德。位圖標題就像是位圖圖像的配方。它包含關於寬度,高度,每像素位數,數據長度等基本信息,以便爲圖像製作合適的陣列。如果你仔細看的位圖頭結構here
但沒有什麼比的源代碼,一個完整的例子更好
製作一個位圖頭是相當容易的。
我把它們分解成一些片段,並在整個過程中爲您評論每一步。它可能看起來有點過分,但對我來說這將是一個很好的指導。
以下是一個2×2像素中,24位的位圖(DIB的Windows頭 BITMAPINFOHEADER)與像素格式RGB24一個例子。
BMP文件格式 - 維基百科
#region Bitmap Making...
// BmpBufferSize : a pure length of raw bitmap data without the header.
// the 54 value here is the length of bitmap header.
byte[] BitmapBytes = new byte[BmpBufferSize + 54];
#region Bitmap Header
// 0~2 "BM"
BitmapBytes[0] = 0x42;
BitmapBytes[1] = 0x4d;
// 2~6 Size of the BMP file - Bit cound + Header 54
Array.Copy(BitConverter.GetBytes(BmpBufferSize + 54), 0, BitmapBytes, 2, 4);
// 6~8 Application Specific : normally, set zero
Array.Copy(BitConverter.GetBytes(0), 0, BitmapBytes, 6, 2);
// 8~10 Application Specific : normally, set zero
Array.Copy(BitConverter.GetBytes(0), 0, BitmapBytes, 8, 2);
// 10~14 Offset where the pixel array can be found - 24bit bitmap data always starts at 54 offset.
Array.Copy(BitConverter.GetBytes(54), 0, BitmapBytes, 10, 4);
#endregion
#region DIB Header
// 14~18 Number of bytes in the DIB header. 40 bytes constant.
Array.Copy(BitConverter.GetBytes(40), 0, BitmapBytes, 14, 4);
// 18~22 Width of the bitmap.
Array.Copy(BitConverter.GetBytes(image.Width), 0, BitmapBytes, 18, 4);
// 22~26 Height of the bitmap.
Array.Copy(BitConverter.GetBytes(image.Height), 0, BitmapBytes, 22, 4);
// 26~28 Number of color planes being used
Array.Copy(BitConverter.GetBytes(0), 0, BitmapBytes, 26, 2);
// 28~30 Number of bits. If you don't know the pixel format, trying to calculate it with the quality of the video/image source.
if (image.PixelFormat == System.Drawing.Imaging.PixelFormat.Format24bppRgb)
{
Array.Copy(BitConverter.GetBytes(24), 0, BitmapBytes, 28, 2);
}
// 30~34 BI_RGB no pixel array compression used : most of the time, just set zero if it is raw data.
Array.Copy(BitConverter.GetBytes(0), 0, BitmapBytes, 30, 4);
// 34~38 Size of the raw bitmap data (including padding)
Array.Copy(BitConverter.GetBytes(BmpBufferSize), 0, BitmapBytes, 34, 4);
// 38~46 Print resolution of the image, 72 DPI x 39.3701 inches per meter yields
if (image.PixelFormat == System.Drawing.Imaging.PixelFormat.Format24bppRgb)
{
Array.Copy(BitConverter.GetBytes(0), 0, BitmapBytes, 38, 4);
Array.Copy(BitConverter.GetBytes(0), 0, BitmapBytes, 42, 4);
}
// 46~50 Number of colors in the palette
Array.Copy(BitConverter.GetBytes(0), 0, BitmapBytes, 46, 4);
// 50~54 means all colors are important
Array.Copy(BitConverter.GetBytes(0), 0, BitmapBytes, 50, 4);
// 54~end : Pixel Data : Finally, time to combine your raw data, BmpBuffer in this code, with a bitmap header you've just created.
Array.Copy(BmpBuffer as Array, 0, BitmapBytes, 54, BmpBufferSize);
#endregion - bitmap header process
#endregion - bitmap making process
的[創建從像素數據的字節數組位圖]可能重複(http://stackoverflow.com/questions/6782489/create-bitmap-from-byte -array-的象素數據) – mbeckish 2012-07-12 12:55:20