錄影是監控系統最核心功能之一。除了本文實作的基本擷取邏輯,實際專案還需自行規劃完整的儲存策略:
VC++ 伺服器端範例未直接提供截圖代碼,但可參考 CSDN 社群常見做法:
int ret = GetJpegImage(aa, bb, cc, dd);
if(ret == 0){
CString str;
str.Format("ch%02d_%s.jpg", iLastSelect, CSStartTime);
FILE *pFile = fopen(str.GetBuffer(0), "wb");
if(pFile){
fwrite(bb, cc, 1, pFile); // 儲存影像
fclose(pFile);
}
}
GetJpegImage 並儲存byte[] imageBuf = new byte[704 * 576 * 2];
int size = 704 * 576 * 2;
HikVisionSDK.GetJpegImage(ChannelHandle, imageBuf, out size, 100);
using (MemoryStream ms = new MemoryStream(imageBuf))
{
Image image = Image.FromStream(ms, true);
image.Save(@"C:\1.jpg");
}
經實測驗證,原範例的 GetJpegImage/GetOriginalImage 簽名有誤,**請務必更新為以下正確版本**:
// 取得原始圖像 (BMP 格式)
public static extern int GetOriginalImage(IntPtr hChannelHandle, byte[] ImageBuf, out int Size);
// 取得 JPEG 壓縮圖像
public static extern int GetJpegImage(IntPtr hChannelHandle, byte[] ImageBuf, out int Size, uint nQuality);
nQuality:JPEG 品質參數 (1-100),範例傳 100 為最高品質out int Size:回傳實際資料長度,配合 MemoryStream 正確截取有效資料Image.FromStream 後 Save 時指定 ImageFormat.Bmp錄影檔案包含三大區塊:
PktSysHeader),含編碼參數、解析度等,僅寫入一次0x00000002,標記檔案正常結束下一篇將詳細剖析 VC++ 官方範例的完整錄影流程與 C# 移植細節。