这段VC代码我翻译的有问题,请指教--谢谢 (在线) (200分)

  • 主题发起人 主题发起人 YuD
  • 开始时间 开始时间
Y

YuD

Unregistered / Unconfirmed
GUEST, unregistred user!
以下为vc的函数定义说明
拷贝当前帧的图像数据
参数: nWidth: 指向用来返回图像宽度单元的指针
nHeight: 指向用来返回图像高度单元的指针
nInterlace: 保留
long nType: 需要读取图像的格式:1:灰度,3:24位真彩色
varpD: 指向用来接收图象数据的缓冲区的指针,该缓冲区大小应能容纳整个数据,在不知大小时应大于768×576×3字节
long CopyCurrentFrameData(long* nWidth, long* nHeight, long* nInterlace, long nType, const VARIANT&amp
varpD);

以下为vc的例子
long nImgWidth;
long nImgHeight;
BYTE *bpImg=(BYTE *)malloc(768*576*3);
varTmp.vt=VT_PTR; varTmp.pbVal=bpImg;
if(SPlayer1.CopyCurrentFrameData((long *)&nImgWidth,(long *)&nImgHeight,(long *)&nInterlace,2,varTmp)==0)
AfxMessageBox("读取错误");
else
//图像处理
free(bpImg);
以下是我在Delphi中的函数叫用方法可是提示
procedure TForm1.Button7Click(Sender: TObject);
var
nImgWidth,nImgHeight,nInterlace:Longint;
bpImg:pByte;
varTmp:variant;
begin
getmem(bpImg,768*576*3);
TvarData(varTmp).VType:=varByRef;
TvarData(varTmp).VPointer:=pointer(@bpImg);
if SPlayer1.CopyCurrentFrameData(nImgwidth,
nimgHeight,
nInterlace,2,vartmp)=0 then
{
if SPlayer1.CopyCurrentFrameData(@nImgwidth,
@nimgHeight,
@nInterlace,2,vartmp) then
}
begin
//---提示失败
end
else
begin
//数据处理
end;
FreeMem(bpImg);
end;
-----------------------
运行时提示 ‘access violation at 0xXXXXXXXX:read of address 0xXXXXXXXX’
如果运行{}中的代码编译不同过。
提示如下
‘[Error] Unit1.pas(125): Types of actual and formal var parameters must be identical’
请各位朋友指教。
 
我帮你改改看
应该用 @ 的方式.
procedure TForm1.Button7Click(Sender: TObject);
var
nImgWidth,nImgHeight,nInterlace:Longint;
bpImg:pByte;
varTmp:olevariant
//改一下
begin
getmem(bpImg,768*576*3);
TvarData(varTmp).VType:=varByRef;
TvarData(varTmp).VPointer:=pointer(@bpImg);
if SPlayer1.CopyCurrentFrameData(@nImgwidth,
@nimgHeight,
@nInterlace,2,vartmp) then
begin
messagebox('失败');
end
else
begin
//数据处理
end;
FreeMem(bpImg);
end;
 
好像有贴字丢失了

if SPlayer1.CopyCurrentFrameData(@nImgwidth,
@nimgHeight,
@nInterlace,2,vartmp)

在 @nImgwidth编译错误
[Error] Unit1.pas(125): Types of actual and formal var parameters must be identical
 
这个问题自己已经解决了。
var
nImgWidth,nImgHeight,nInterlace:longint;
bpImg:pByte;
varTmp:variant;
begin
getmem(bpImg,768*576*3);
TvarData(varTmp).VType:=varByRef;
TvarData(varTmp).VPointer:=pointer(bpImg);
SPlayer1.CopyCurrentFrameData(nimgwidth,
nimgheight,ninterlace,2,vartmp);
FreeMem(bpImg);
end;

现在的问题是怎样吧 varTmp 中的图像显示出来。见到指针就晕蔡。
同样发分
 
虽然没有结果,发分了。
 
//这个问题的错误原因是因为 那个 bpImg的指针使用不当吗?
TvarData(varTmp).VPointer:=pointer(bpImg);
而不是 TvarData(varTmp).VPointer:=pointer(@bpImg);

//如果你拷贝下来的图像是 BMP
//可以用 Cstatic 这个MFC的类来显示.
Delphi里面用 image就行了啊! load一下
 
to itren
应该是bmp文件,但是好像不是完整的文件,缺少文件头信息。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
898
import
I
后退
顶部