我用的是深圳豪威的视频卡,他提供的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 数组或指针呀?
希望大家能帮忙!谢谢

解决方案 »

  1.   

    >> BYTE *pbImageBuf,
    pbImageBuf是一个Byte型指针,*pbImageBuf是一个Byte类型的值
      

  2.   

    我就不明白 GetOriginalImage 的第二个参数怎么会是 byte 型的,应该是 byte 数组或指针呀?
    希望大家能帮忙!谢谢BYTE* <-> PByte;
    樓主 可以查一下歷史紀錄。。
      

  3.   

    谢谢关注!可是pbyte 如何能存储YUV422格式的图形数据??即便是我将函数申明改为如下:function GetOriginalImage(hChannelHandle: Hwnd; var pbImageBuf: pbyte; var pdwWidth: integer; var pdwHeight: integer; var pdwMode: integer): integer; stdcall; external SZDllFile;这样调用:
    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
      

  4.   

    buf: ^PByte;
    指针的指针...胡乱猜测而已^_^
    也许视频卡抓图也可以用一些通用的方法,比如AviCap32.dll
      

  5.   

    可是pbyte 如何能存储YUV422格式的图形数据??
    /////////////
    PByte 能儲存任何類型的數據噢因為它是最小的單位
      

  6.   

    可是YUV422的图形可不是一个字节呀
      

  7.   

    哪位能给我一个使用pbyte作为参数,从函数中带出大量byte数据的例子