MemoryStream ms = new MemoryStream(data.TP); // data.TP為byte[]
Image img = Image.FromStream(ms); // 拋出 ArgumentException: 參數無效
調試發現`ms.ReadTimeout`/`WriteTimeout`拋出`InvalidOperationException`。
public Image LoadImageSafe(byte[] imageData) {
if (imageData == null || imageData.Length == 0)
throw new ArgumentException("圖片數據為空");
// 1. 驗證文件簽名
if (!IsValidImageHeader(imageData))
throw new ArgumentException("無效圖片格式");
// 2. 創建流並歸零位置
using (var ms = new MemoryStream(imageData)) {
ms.Position = 0; // 關鍵:確保從頭讀取
try {
// 3. 延遲驗證避免鎖定流
using (var img = Image.FromStream(ms, true, true)) {
return new Bitmap(img); // 複製像素數據,釋放流鎖定
}
} catch (ArgumentException ex) {
throw new InvalidOperationException("圖片解碼失敗", ex);
}
}
}
private bool IsValidImageHeader(byte[] data) {
if (data.Length < 4) return false;
// JPEG: FF D8 FF
if (data[0] == 0xFF && data[1] == 0xD8 && data[2] == 0xFF) return true;
// PNG: 89 50 4E 47
if (data[0] == 0x89 && data[1] == 0x50 && data[2] == 0x4E && data[3] == 0x47) return true;
// BMP: 42 4D
if (data[0] == 0x42 && data[1] == 0x4D) return true;
// GIF: 47 49 46 38
if (data[0] == 0x47 && data[1] == 0x49 && data[2] == 0x46 && data[3] == 0x38) return true;
return false;
}
「參數無效」90%源於二進制數據損壞或格式不匹配。建立「驗證簽名→歸零流位置→安全解碼→複製像素」標準流程,配合數據庫層面約束,可徹底消除此類異常。