將 System.Drawing.Image 轉為 byte[] 是常見需求 (儲存資料庫、網路傳輸、快取)。本文實測三種主流做法:**LockBits 直接存取像素**、**ImageConverter 內建轉換**、**MemoryStream 儲存編碼**,詳細分析效能、輸出格式、適用場景,助你選對工具。
public static byte[] ImageToBytes_LockBits(Image img)
{
using (Bitmap bmp = new Bitmap(img))
{
BitmapData bmpData = bmp.LockBits(
new Rectangle(Point.Empty, img.Size),
ImageLockMode.ReadOnly,
PixelFormat.Format24bppRgb); // 強制 24bpp,無 Alpha
int stride = bmpData.Stride; // 每行位元組數 (含補齊)
byte[] rgbValues = new byte[stride * bmpData.Height];
Marshal.Copy(bmpData.Scan0, rgbValues, 0, rgbValues.Length);
bmp.UnlockBits(bmpData);
return rgbValues; // 純 BGR 像素陣列,無檔案標頭
}
}
public static byte[] ImageToBytes_Converter(Image img)
{
var converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
// 內部實際呼叫 img.Save(stream, 原始格式),效能差、格式不可控
}
public static byte[] ImageToBytes_MemoryStream(Image img, ImageFormat format = null)
{
using (var ms = new MemoryStream())
{
img.Save(ms, format ?? ImageFormat.Png); // 預設 PNG,無損壓縮
return ms.ToArray(); // 含完整檔案標頭 (PNG/JPG/BMP 標準格式)
}
}
| 方法 | 單次平均 (ms) | 5000 次總耗時 (ms) | 輸出大小 | 備註 |
|---|---|---|---|---|
| LockBits (Format24bppRgb) | ~0.02 | ~100 | 30,000 bytes (100x100x3) | 純像素,無壓縮,最快 |
| MemoryStream (PNG) | ~0.03 | ~150 | ~8,000 bytes | 含壓縮編碼開銷,輸出標準檔案 |
| MemoryStream (BMP) | ~0.025 | ~125 | ~30,000 bytes | 無壓縮,編碼較 PNG 快 |
| ImageConverter | ~0.15 | ~750 | 不定 | 反射/內部轉換開銷大,**不推薦** |
| 維度 | LockBits | MemoryStream | ImageConverter |
|---|---|---|---|
| 輸出內容 | 原始像素陣列 (BGR/RGB) | 標準圖片檔案 (含 Header) | 不確定 (視原始格式) |
| 可直接寫入資料庫/傳輸 | 需自行協議解析寬高/格式 | ✅ 通用相容 | ⚠️ 格式不定 |
| 支援透明通道 (Alpha) | 需改 Format32bppArgb | ✅ PNG 原生支援 | 視原圖 |
| 記憶體佔用 | 低 (僅像素陣列) | 中 (Stream + 編碼緩衝) | 高 |
| 適用場景 | 即時影像處理、GPU 上傳、自定義壓縮 | 儲存檔案、資料庫 Blob、Web 傳輸 | 避免使用 |
PixelFormat.Format32bppArgb,Stride = Width * 4。LockBits 分塊讀寫或 MemoryStream 串流式處理。System.Drawing.Common 僅支援 Windows/Linux (libgdiplus),macOS/容器環境建議改用 SkiaSharp、ImageSharp 等純管理式庫。**首選 MemoryStream + img.Save(format)**:輸出標準格式、相容性佳、效能優異。需極致速度且自行處理格式協議時,用 LockBits。請**永遠避開 ImageConverter**。選對工具,圖片轉 byte[] 既快又穩。