头大!Dib?我想要Bitmap....(300)

  • 主题发起人 主题发起人 大愚
  • 开始时间 开始时间

大愚

Unregistered / Unconfirmed
GUEST, unregistred user!
做一个VGA采集,采集卡提供的回调函数是这样的:procedure SnapCallback(lpBuf: PBYTE; len:integer; pContext:PInteger); stdcall;但这个lpBuf出来的不是个BMP图片,好像是dib图片,只能用StretchDIBits(bmp.Canvas.Handle, 10, 10, 800, 600, 0, 0, 800, 600, lpBuf, pInfo^, DIB_RGB_COLORS, SRCCOPY);来画到bmp图片上.我想直接将lpBuf数据用数据流的形式写到bmp中,请问大家有这种可能吗?另:pInfo是PBITMAPINFO结构.
 
自己写一个文件头三位图文件头其结构定义如下:typedef struct tagBITMAPFILEHEADER{ WORDbfType; // 位图文件的类型,必须为BMDWORD bfSize; // 位图文件的大小,以字节为单位WORDbfReserved1; // 位图文件保留字,必须为0WORDbfReserved2; // 位图文件保留字,必须为0DWORD bfOffBits; // 位图数据的起始位置,以相对于位图// 文件头的偏移量表示,以字节为单位} BITMAPFILEHEADER;位图文件头分4部分,共14字节:名称 占用空间 内容 实际数据 bfType 2字节 标识,就是“BM”二字 BM bfSize 4字节 整个BMP文件的大小 0x50(80) bfReserved1/2 4字节 保留字,没用 0 bfOffBits 4字节 偏移数,即 位图文件头+位图信息头+调色板 的大小 0x36(54) 注意,Windows的数据是倒着念的,这是PC电脑的特色。如果一段数据为50 1A 25 3C,倒着念就是3C 25 1A 50,即0x3C251A50。因此,如果bfSize的数据为50 00 00 00,实际上就成了0x00000050,也就是0x50。
 
谢谢lqcros,我查了一下PBITMAPINFO是44个字节,但实际上我这个大小的BMP有54字节,不知道差了哪些,而且我用先将获取的数据保存成内存流,再把内存流存成BMP,好像速度很慢,不知道有没有更快的方法?
 
bmp也支持dib格式的啊,读写视频内存快的bmp格式啊
 
嗯,好像BMP的数据区就是DIB格式,只是给DIB加了个头,如果把这段DIB赋给BMP会报错,因为少个文件头,现在主要就是怎么用最快的方法拼出这个文件头了.
 
BITMAPFILEHEADER
 
后退
顶部