首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

C# 圖片轉 Byte 陣列三大法性能大比拼:LockBits vs ImageConverter vs MemoryStream

     編輯:關於ASP.NET

將 System.Drawing.Image 轉為 byte[] 是常見需求 (儲存資料庫、網路傳輸、快取)。本文實測三種主流做法:**LockBits 直接存取像素**、**ImageConverter 內建轉換**、**MemoryStream 儲存編碼**,詳細分析效能、輸出格式、適用場景,助你選對工具。

三種實作程式碼

方法 1:LockBits (最高效能、原始像素資料)

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 像素陣列,無檔案標頭
    }
}

方法 2:ImageConverter (最慢、輸出格式不確定)

public static byte[] ImageToBytes_Converter(Image img)
{
    var converter = new ImageConverter();
    return (byte[])converter.ConvertTo(img, typeof(byte[]));
    // 內部實際呼叫 img.Save(stream, 原始格式),效能差、格式不可控
}

方法 3:MemoryStream + Save (效能接近 LockBits、標準圖片格式)

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 標準格式)
    }
}

效能實測結果 (5000 次迭代,100x100 PNG 圖片)

方法單次平均 (ms)5000 次總耗時 (ms)輸出大小備註
LockBits (Format24bppRgb)~0.02~10030,000 bytes (100x100x3)純像素,無壓縮,最快
MemoryStream (PNG)~0.03~150~8,000 bytes含壓縮編碼開銷,輸出標準檔案
MemoryStream (BMP)~0.025~125~30,000 bytes無壓縮,編碼較 PNG 快
ImageConverter~0.15~750不定反射/內部轉換開銷大,**不推薦**

關鍵差異總結

維度LockBitsMemoryStreamImageConverter
輸出內容原始像素陣列 (BGR/RGB)標準圖片檔案 (含 Header)不確定 (視原始格式)
可直接寫入資料庫/傳輸需自行協議解析寬高/格式✅ 通用相容⚠️ 格式不定
支援透明通道 (Alpha)需改 Format32bppArgb✅ PNG 原生支援視原圖
記憶體佔用低 (僅像素陣列)中 (Stream + 編碼緩衝)高
適用場景即時影像處理、GPU 上傳、自定義壓縮儲存檔案、資料庫 Blob、Web 傳輸避免使用

進階提示

  • LockBits + 32bppArgb:需保留 Alpha 通道時,改用 PixelFormat.Format32bppArgb,Stride = Width * 4。
  • 大圖分塊處理:超大圖片 (如 4K+) 避免一次配置巨大陣列,改用 LockBits 分塊讀寫或 MemoryStream 串流式處理。
  • 效能關鍵路徑:若在高頻迴圈 (如即時影像串流),重用 Bitmap/Byte 陣列,避免 GC 壓力。
  • 跨平台注意:System.Drawing.Common 僅支援 Windows/Linux (libgdiplus),macOS/容器環境建議改用 SkiaSharp、ImageSharp 等純管理式庫。

結語

**首選 MemoryStream + img.Save(format)**:輸出標準格式、相容性佳、效能優異。需極致速度且自行處理格式協議時,用 LockBits。請**永遠避開 ImageConverter**。選對工具,圖片轉 byte[] 既快又穩。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved