把数据从Pbyte读取到stream的问题

22932565 2011-06-17 11:01:27
首先是一个调用一个指纹设备的api
int SFEP_GetLiveImage( PBYTE *p_pImageBuffer ) //从指纹采集器获取一幅图像并返回保存图像的地址。



在delphi中我是这样实现的

function SFEP_GetLiveImage(p_pImageBuffer: PByte): integer; stdcall external 'xxx.dll';



var
PByt,PPbyte: Pbyte;

PPbyte := @pByt;
SFEP_GetLiveImage(PPbyte);
Stream.Position := 0;
Stream.Writebuffer(pByt,sizeof(pByt));
Stream.Position := 0;
DeleteFile(ExtractFilePath(ParamStr(0))+'aaa.BMP');
Stream.SaveToFile(ExtractFilePath(ParamStr(0))+'aaa.BMP');

在得到p_pImageBuffer之后 我想通过stream加载该数据,然后再由加载到bmp中, 然后把图片显示出来,但是总是得不到图片。
希望哪位大仙能帮我看一下

...全文
1898 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
mdejtod 2011-06-18
  • 打赏
  • 举报
回复
被采集图像的大小为 IMAGE_WIDTH*IMAGE_HEIGHT 。
这里不是写了么?看来应该是灰度图,就是位深是8位的,也就是每个像素占一个字节。600*400;
mdejtod 2011-06-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 22932565 的回复:]
引用 8 楼 mdejtod 的回复:
Stream.Writebuffer(pByt,sizeof(pByt));
第二个参数改为缓冲区的长度,600*400*位深(1:位;3:24位;4:32位);


这个缓冲区的长度不是很明白 我这里应该怎么的得到
[/Quote]
你不是说了是获取图像的吗?那内存所占的大小就为 600*400*(1或3或4);
位深度一般为8,24,32位这三种,值分别是8位 : 1;24位 :3;32位 :4);
这就是图像所占的内存总的大小
22932565 2011-06-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mdejtod 的回复:]
Stream.Writebuffer(pByt,sizeof(pByt));
第二个参数改为缓冲区的长度,600*400*位深(1:位;3:24位;4:32位);
[/Quote]

这个缓冲区的长度不是很明白 我这里应该怎么的得到
22932565 2011-06-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xinghun61 的回复:]
引用 9 楼 bzworinima 的回复:
把指纹机的输出函数,研究一下,看还有什么内容


赞同。
从楼主目前的描述中,我无法知道p_pImageBuffer中到底返回的是些啥东西。
要知道,一个BMP文件是由下面这几部分构成的:

BM标识
文件头
调色盘
每个像素的具体颜色值
如果返回的数据缺少这里面任何一部分的话,你在写流时,就需要对这部分手动进行构造,否则,图片……
[/Quote]

Prototype int SFEP_GetLiveImage( PBYTE *p_pImageBuffer )
Parameter p_pImageBuffer IN, OUT 保存被采集图像的缓冲器
Return Value RES_OK 成功
ERR_NOT_USBDEV 无法从 USB 设备获取图像。
Function 从指纹采集器获取一幅图像并返回保存图像的地址。该函数虽然没有指纹输入但照样采集图像。
若采集成功,则 p_pImageBuffer 中返回图像的地址。
若出错,则 p_pImageBuffer 中返回 NULL 。
被采集图像的大小为 IMAGE_WIDTH*IMAGE_HEIGHT 。
Note 开发人员利用 p_pImageBuffer 中的地址,保存及显示图像。并且可利用于其它 SDK 函数的参数。
xinghun61 2011-06-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bzworinima 的回复:]
把指纹机的输出函数,研究一下,看还有什么内容
[/Quote]

赞同。
从楼主目前的描述中,我无法知道p_pImageBuffer中到底返回的是些啥东西。
要知道,一个BMP文件是由下面这几部分构成的:

BM标识
文件头
调色盘
每个像素的具体颜色值

如果返回的数据缺少这里面任何一部分的话,你在写流时,就需要对这部分手动进行构造,否则,图片格式都不正确,肯定打不开了。

如果这几个部分都没有问题,那么,就可以通过读取“文件头”信息,获取图片的大小,也就解决了上面“sizeof(pByt)”的问题。

另外,文件头一般是BITMAPINFOHEADER类型的结构,其biSizeImage字段,应该就是文件的大小了,具体参考MSDN吧。
tcds31 2011-06-18
  • 打赏
  • 举报
回复
按照 600*400*1(8位位图) 计算尺寸
bdmh 2011-06-17
  • 打赏
  • 举报
回复
sizeof(pByt),可不是流的长度,而是指针类型长度,4字节
yqdragon 2011-06-17
  • 打赏
  • 举报
回复
up and learn
bzworinima 2011-06-17
  • 打赏
  • 举报
回复
把指纹机的输出函数,研究一下,看还有什么内容
mdejtod 2011-06-17
  • 打赏
  • 举报
回复
Stream.Writebuffer(pByt,sizeof(pByt));
第二个参数改为缓冲区的长度,600*400*位深(1:位;3:24位;4:32位);
22932565 2011-06-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]
sizeof(pByt),可不是流的长度,而是指针类型长度,4字节
[/Quote]

那应该怎么得到?
22932565 2011-06-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bzworinima 的回复:]
缺少缓冲区长度参数
function SFEP_GetLiveImage(p_pImageBuffer: PByte; Bufferlen: integer): integer; stdcall external 'xxx.dll';

两种可能 要么是少了长度参数 ,要么是函数返回长度

var
PByt,PPbyte: Pbyte;
Stream: Tmemorystre……
[/Quote]

这个api没有办法返回长度的 返回的是成功还是不成功
22932565 2011-06-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hongqi162 的回复:]
>>首先是一个调用一个指纹设备的api
>>int SFEP_GetLiveImage( PBYTE *p_pImageBuffer ) //从指纹采集器获取一幅图像并返回保存图像的地址。

应该还有一个能够获得图片大小的函数吧,只知道指针还不够
[/Quote]

图片大小是定义的常量,600*400
bzworinima 2011-06-17
  • 打赏
  • 举报
回复
缺少缓冲区长度参数
function SFEP_GetLiveImage(p_pImageBuffer: PByte; Bufferlen: integer): integer; stdcall external 'xxx.dll';

两种可能 要么是少了长度参数 ,要么是函数返回长度

var
PByt,PPbyte: Pbyte;
Stream: Tmemorystream;
begin
//PPbyte := @pByt;
//如果函数返回长度
Bufferlen := SFEP_GetLiveImage(Pbyte);
Stream:= Tmemorystream.Create;
Stream.Position := 0;
Stream.Writebuffer(@pByt[0],Bufferlen);
DeleteFile(ExtractFilePath(ParamStr(0))+'aaa.BMP');
Stream.SaveToFile(ExtractFilePath(ParamStr(0))+'aaa.BMP');
山东蓝鸟贵薪 2011-06-17
  • 打赏
  • 举报
回复
学习中.............
hongqi162 2011-06-17
  • 打赏
  • 举报
回复
>>首先是一个调用一个指纹设备的api
>>int SFEP_GetLiveImage( PBYTE *p_pImageBuffer ) //从指纹采集器获取一幅图像并返回保存图像的地址。

应该还有一个能够获得图片大小的函数吧,只知道指针还不够

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧