首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 將資料庫二進位資料轉換為圖片:完整實作與避坑指南

     編輯:程式設計綜合問答

核心程式碼

public Image BytesToImage(byte[] imageData)
{
    if (imageData == null || imageData.Length == 0) return null;
    using (var ms = new MemoryStream(imageData))
    {
        // 驗證圖片格式,避免惡意資料導致 GDI+ 例外
        try { return Image.FromStream(ms, useEmbeddedColorManagement: true, validateImageData: true); }
        catch (ArgumentException) { throw new InvalidDataException("資料非有效圖片格式"); }
    }
}

關鍵細節解析

1. 必須確認資料為支援格式

  • Image.FromStream 僅支援 BMP、PNG、JPEG、GIF、TIFF、ICO、WMF、EMF。
  • 資料庫若儲存 RAW 感測器資料、加密 Blob 或非標準格式,直接轉換會拋出 ArgumentException。

2. 串流位置重置

若同一 MemoryStream 讀取多次(如先驗證再顯示),需在每次 Image.FromStream 前執行 ms.Position = 0;。

3. 大圖片記憶體壓力

  • 超過 10 MB 圖片建議改用 Image.FromFile 暫存檔或 BitmapDecoder 串流解碼。
  • WPF/UWP 專案優先使用 BitmapImage + StreamSource 享受 UI 虛擬化。

4. 資料庫讀取完整模式

using (var conn = new SqlConnection(cs))
using (var cmd = new SqlCommand("SELECT Photo FROM Employees WHERE Id=@id", conn))
{
    cmd.Parameters.AddWithValue("@id", id);
    conn.Open();
    // ExecuteScalar 適用單一欄位
    var bytes = (byte[])cmd.ExecuteScalar();
    return BytesToImage(bytes);
}

常見錯誤與對策

錯誤訊息原因解決
Parameter is not validByte 陣列損毀/非圖片寫入前驗證 Magic Number (FF D8 FF / 89 50 4E 47)
Out of memory大圖載入 LOH 碎片分塊解碼 / 降低解析度 / 改用 SkiaSharp
Access deniedGDI+ 需臨時檔案權限確保 IIS_IUSRS 對 %TEMP% 有寫入權

進階:轉為 Base64 內嵌前端

string base64 = Convert.ToBase64String(imageData);
string dataUrl = $"data:image/png;base64,{base64}"; // 直接用於 <img src=...>

總結

MemoryStream + Image.FromStream 是標準做法,關鍵在於輸入驗證、串流管理與例外處理。建議在資料寫入資料庫時同步檢查檔案簽名,源頭把關,避免髒資料污染。

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