我用的是深圳豪威的视频卡,他提供的SDK的Demo是 VC 的,大部分代码我已经翻译成Delphi的了,但一个抓图的函数总是出错,联系厂家也无结果,只好向大家求助。ADT_API int __stdcall GetOriginalImage( HANDLE hChannelHandle,
BYTE *pbImageBuf,
DWORD *pdwWidth,
DWORD *pdwHeight,
DWORD *pdwMode) ;ADT_API int __stdcall SaveYUVToBmpFile(char *FileName, BYTE* pbBufYuv,DWORD dwWidth,DWORD dwHeight);
ADT_API int __stdcall LoadYUVFromBmpFile(char *FileName, BYTE *pYuv, int iBufLen, DWORD* pdwWidth, DWORD* pdwHeight);void CSysDemoDlg::OnCaptureBmp()
{
// TODO: Add your control notification handler code here
BYTE *pbBuf;
DWORD dwWidth,dwHeight,dwMode; CString strTmp;
char strFileName [ 200];
CFileDialog fileDlg(FALSE,"*.bmp",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"file(*.bmp) | *.bmp||",this); pbBuf = (BYTE *) malloc( 720 * 576 * 4);
if(GetOriginalImage(hChannelHandle[0],pbBuf,&dwWidth,&dwHeight,&dwMode))
{
AfxMessageBox("error!");
return ;
}
if(fileDlg.DoModal()==IDOK)
{
strTmp = fileDlg.GetPathName();
strcpy(strFileName,strTmp) ;
SaveYUVToBmpFile(strFileName, pbBuf, dwWidth, dwHeight); }
free(pbBuf);
}厂家提供的三个函数是在delphi中是这样声明的:
function LoadYUVFromBmpFile(var FileName: string; var yuv: Pchar; BufLen: integer; var Width: integer; var Height: integer): integer; stdcall; external SZDllFile;
//说明:把24位bmp 文件转成yuv格式的数据;
//参数: char *FileName 文件名
//BYTE *yuv YUV422格式的图像指针
//int BufLen yuv缓存大小
//int *Width 返回yuv图像的宽度
//Int *Height 返回yuv图像的高度
//返回:正确返回ADT_SUCCESS, 其他为第1节定义的错误号;function SaveYUVToBmpFile(FileName: Pchar; var yuv: byte; Width: integer; Height: integer): integer; stdcall; external SZDllFile;
//说明:把yuv 图像转成bmp文件;
//参数:char *FileName 文件名
//BYTE *yuv YUV422格式的图像指针
//int Width yuv图像的宽度
//int Height yuv图像的高度
//返回:正确返回ADT_SUCCESS, 其他为第1节定义的错误号;function GetOriginalImage(hChannelHandle: Hwnd; var pbImageBuf: byte; var pdwWidth: integer; var pdwHeight: integer; var pdwMode: integer): integer; stdcall; external SZDllFile;//说明:获得原始图像,原始图像大小, YUV422格式,用户程序可调用SaveYUVToBmpFile来生成24位的bmp文件,下面的板卡类型和数据大小对应表
//SZ-6414 ******************* 352 * 288
//SZ-6422 ******************* 704 * 288
//SZ-0314 ******************* 352 * 288
//SZ-6418 ******************* 352 * 288//参数:HANDLE hChannelHandle 通道句柄
//BYTE *pbImageBuf 原始图像指针 ;
//DWORD *pdwWidth 返回图相的宽度,对SZ-6414和SZ-0314系列板卡为 352,对SZ-6422系列板卡为704,对SZ-6418系列板卡为352
//DWORD *pdwHeight返回图相的高度,目前的所有板卡都为 288
//DWORD *pdwMode保留.
//返回:正确返回ADT_SUCCESS, 其他为第1节定义的错误号;
我就不明白 GetOriginalImage 的第二个参数怎么会是 byte 型的,应该是 byte 数组或指针呀?
希望大家能帮忙!谢谢
BYTE *pbImageBuf,
DWORD *pdwWidth,
DWORD *pdwHeight,
DWORD *pdwMode) ;ADT_API int __stdcall SaveYUVToBmpFile(char *FileName, BYTE* pbBufYuv,DWORD dwWidth,DWORD dwHeight);
ADT_API int __stdcall LoadYUVFromBmpFile(char *FileName, BYTE *pYuv, int iBufLen, DWORD* pdwWidth, DWORD* pdwHeight);void CSysDemoDlg::OnCaptureBmp()
{
// TODO: Add your control notification handler code here
BYTE *pbBuf;
DWORD dwWidth,dwHeight,dwMode; CString strTmp;
char strFileName [ 200];
CFileDialog fileDlg(FALSE,"*.bmp",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"file(*.bmp) | *.bmp||",this); pbBuf = (BYTE *) malloc( 720 * 576 * 4);
if(GetOriginalImage(hChannelHandle[0],pbBuf,&dwWidth,&dwHeight,&dwMode))
{
AfxMessageBox("error!");
return ;
}
if(fileDlg.DoModal()==IDOK)
{
strTmp = fileDlg.GetPathName();
strcpy(strFileName,strTmp) ;
SaveYUVToBmpFile(strFileName, pbBuf, dwWidth, dwHeight); }
free(pbBuf);
}厂家提供的三个函数是在delphi中是这样声明的:
function LoadYUVFromBmpFile(var FileName: string; var yuv: Pchar; BufLen: integer; var Width: integer; var Height: integer): integer; stdcall; external SZDllFile;
//说明:把24位bmp 文件转成yuv格式的数据;
//参数: char *FileName 文件名
//BYTE *yuv YUV422格式的图像指针
//int BufLen yuv缓存大小
//int *Width 返回yuv图像的宽度
//Int *Height 返回yuv图像的高度
//返回:正确返回ADT_SUCCESS, 其他为第1节定义的错误号;function SaveYUVToBmpFile(FileName: Pchar; var yuv: byte; Width: integer; Height: integer): integer; stdcall; external SZDllFile;
//说明:把yuv 图像转成bmp文件;
//参数:char *FileName 文件名
//BYTE *yuv YUV422格式的图像指针
//int Width yuv图像的宽度
//int Height yuv图像的高度
//返回:正确返回ADT_SUCCESS, 其他为第1节定义的错误号;function GetOriginalImage(hChannelHandle: Hwnd; var pbImageBuf: byte; var pdwWidth: integer; var pdwHeight: integer; var pdwMode: integer): integer; stdcall; external SZDllFile;//说明:获得原始图像,原始图像大小, YUV422格式,用户程序可调用SaveYUVToBmpFile来生成24位的bmp文件,下面的板卡类型和数据大小对应表
//SZ-6414 ******************* 352 * 288
//SZ-6422 ******************* 704 * 288
//SZ-0314 ******************* 352 * 288
//SZ-6418 ******************* 352 * 288//参数:HANDLE hChannelHandle 通道句柄
//BYTE *pbImageBuf 原始图像指针 ;
//DWORD *pdwWidth 返回图相的宽度,对SZ-6414和SZ-0314系列板卡为 352,对SZ-6422系列板卡为704,对SZ-6418系列板卡为352
//DWORD *pdwHeight返回图相的高度,目前的所有板卡都为 288
//DWORD *pdwMode保留.
//返回:正确返回ADT_SUCCESS, 其他为第1节定义的错误号;
我就不明白 GetOriginalImage 的第二个参数怎么会是 byte 型的,应该是 byte 数组或指针呀?
希望大家能帮忙!谢谢
pbImageBuf是一个Byte型指针,*pbImageBuf是一个Byte类型的值
希望大家能帮忙!谢谢BYTE* <-> PByte;
樓主 可以查一下歷史紀錄。。
var
intWidth, intHeight, intMode: Integer;
//buf: PBufByteArray;
buf: PByte;
begin
// 720 * 576 * 4 intWidth := 0;
intHeight := 0;
intMode := 0;
if GetOriginalImage(hChannelHandle[PreviewWin[intChannel].Channel], buf,
intWidth, intHeight, intMode) <> 0 then
begin
exit;
end;执行到GetOriginalImage还是出错?WHY??我也曾经将其改为 byte 数组,PBufByteArray 定义如下:PBufByteArray = ^TBufByteArray;
TBufByteArray = array[0..720*576*3] of Byte;也是出错?痛苦ing
指针的指针...胡乱猜测而已^_^
也许视频卡抓图也可以用一些通用的方法,比如AviCap32.dll
/////////////
PByte 能儲存任何類型的數據噢因為它是最小的單位