用指纹采集设备采集了裸图形数据文件,如何让它在TImage中显示成指纹图形(300分)

  • 主题发起人 主题发起人 whsunbin
  • 开始时间 开始时间
W

whsunbin

Unregistered / Unconfirmed
GUEST, unregistred user!
用指纹采集设备采集了裸图形数据文件,如何让它在TImage中显示成指纹图形
望能提供源代码
 
不知道这个答案你是否满意~!
Image1.Picture.Bitmap.Assign (query1.fieldbyname('picture'));
 
To:狮子王
你没看懂问题
我问的是如何将裸图形数据转换成Win32的图形数据格式,并在TImage中显示
 
用GetDIB()接收,这样可以获得与设备无关的位图,再显示即可!
 
Image.Picture.LoadFromFile(BMPPATH+'plate.bmp');
不知道这样可不可以??
 
硬件设备应该有相应的函数吧!
 
硬件设备只提供了采集数据的函数,但采集的是裸图形数据,需要自己用API函数生成
Win32图形,可是我看不懂它提供的例子(C++写的)。
我想Delphi中应该有相应的函数吧
 
在资源文件里定义一个bmp
引用这个bmp的头文件将你的文件加载就可以了
 
能具体点吗
 
是这样的。采集的文件是纯点阵的格式,640*640*256灰度,见下面程序
void Display(byte* buffer)
{
byte* line;
Graphics::TBitmap* tB = new Graphics::TBitmap();
tB->Width = 640;
tB->Height = 640;
tB->PixelFormat = pf24bit;
for(int i=0;i<640;i++)
{
line =(byte*) tB->ScanLine;
for(int j=0;j<640;j++)
{
line[j*3] = buffer[640*i+j];
line[j*3+1] = line[j*3];
line[j*3+2] = line[j*3];
}
}
Form1->image->Picture->Assign(tB);
delete tB;
}
 
To:wyly
在Delphi下如何实现
 
在Delphi下上述程序应该可以改为:
procedure Display( buffer : PByteArray) ;
var
line:PByteArray;
tB : TBitMap;
i ,j: integer;
begin
tB := TBitMap.create;
tB.Width := 640;
tB.Height := 640;
tB.PixelFormat := pf24bit;
for i:=0 to 640 do
begin
line := tB.ScanLine;
for j:=0 to 640 do
begin
line[j*3] := buffer[640*i+j];
line[j*3+1] := line[j*3];
line[j*3+2] := line[j*3];
end;
end;
Form1.image1.Picture.Assign(tB);
tB.Free;
end;
上述程序语法没有问题。
 
好象要用到CreateDIBSection函数创建图形,如有谁能解决
与问题http://www.delphibbs.com/delphibbs/dispq.asp?lid=795602一起给分
 
我帮你解决了。对了你在武汉?
 
To:wyly
我原来在武汉,现在不在
你的方法我试过了,但总是不能显示图形,不知你做过指纹设备的程序没有,帮我看看下面
的代码,谢谢
procedure TForm1.Button4Click(Sender: TObject);
Var
Row,Col:Integer;
Ret_Val,Tries,Image_size:Integer;
mStream,mReshape:TMemoryStream;
pImage,pReshape:Pointer;
BMP:TBitMap;
Image_Size_X,Image_Size_Y,Dest_Size_X:Integer;
BMPInfoHead:TBITMAPINFO;
begin
mStream:=TMemoryStream.Create;
mReshape:=TMemoryStream.Create;
Image_Size_X:=Image1.Width;
Image_Size_Y:=Image1.Height;
Dest_Size_X:=Image_Size_X;
Try
Ret_Val:=pbInitialize();
if ret_Val<>PBOK then
Begin
Print_Error(Ret_Val);
Exit;
End;
Ret_Val:=pbGetRawImageSize(Row,Col);//得到指纹数据大小(按字节算)
Image_Size:=Row*Col;
if ret_Val<>PBOK then
Begin
Print_Error(Ret_Val);
pbClose();
Exit;
End;

mStream.SetSize(Image_Size);
mStream.Position:=0;
pImage:=mStream.Memory;
Tries:=1;
Repeat
Ret_Val:=pbGetRawImage(pImage);//得到指纹数据
if ret_Val<>PBOK then
Begin
Print_Error(Ret_Val);
pbClose();
Exit;
End;
mReshape.SetSize(Image_Size_X*Image_Size_Y);
mReshape.Position:=0;
pReshape:=mReshape.Memory;
//改变图形尺寸
Ret_Val:=pbReshapeImage(pImage,Image_Size_X,Image_Size_Y,Dest_Size_X,pReshape);
if ret_Val<>PBOK then
Begin
Print_Error(Ret_Val);
pbClose();
Exit;
End;

//设置头信息
BMPInfoHead.bmiHeader.biSize:=SizeOf(TBITMAPINFO);
BMPInfoHead.bmiHeader.biWidth:=Image_Size_X;
BMPInfoHead.bmiHeader.biHeight:=Image_Size_Y;
BMPInfoHead.bmiHeader.biBitCount:=24;
BMPInfoHead.bmiHeader.biPlanes:=1;
BMPInfoHead.bmiHeader.biCompression:=BI_RGB;
BMPInfoHead.bmiHeader.biSizeImage:=Image_Size_X*Image_Size_Y*3;
BMPInfoHead.bmiHeader.biXPelsPerMeter:=0;
BMPInfoHead.bmiHeader.biYPelsPerMeter:=0;
BMPInfoHead.bmiHeader.biClrUsed:=0;
BMPInfoHead.bmiHeader.biClrImportant:=0;
StretchDIBits(Image1.Canvas.Handle,
0, 0, 352, 288,
0, 0, 352, 288,
pReshape,BMPInfoHead, 0, SRCCOPY);
inc(tries);
Until (tries>23);
Finally
mStream.Free;
mReshape.Free;
End;
end;
 
这样,首先你采集的文件是不是.d文件?
第二,我发你一个程序,你看看就知道了。
对不起,
StretchDIBits(Image1.Canvas.Handle,
0, 0, 352, 288,
0, 0, 352, 288,
pReshape,BMPInfoHead, 0, SRCCOPY)
应该写成

StretchDIBits(Image1.Canvas.Handle,
0, 0, 640, 640,
0, 0, 640, 640,
pReshape,BMPInfoHead, 0, SRCCOPY)
 
To:wyly
什么是.d文件,我采集的数据就是一个数据流,它例子提供的是一个.png文件
我改了以后还是没有显示。
我的邮箱:sunbin@pouyuen.com.cn
谢谢
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
815
DelphiTeacher的专栏
D
后退
顶部