知道位图缓存的指针,如何得到位图的数据?(100分)

  • 主题发起人 主题发起人 lfeng15
  • 开始时间 开始时间
L

lfeng15

Unregistered / Unconfirmed
GUEST, unregistred user!
知道位图缓存的指针,如何得到位图的数据?我想对数据进行分析,找出特殊的颜色。谢谢
 
各位大侠看看吧
 
什么是“位图缓存的指针”?我认为自己对位图很了解,可是今天却不知道你说什么?
 
PBit : PByteArray;
while y < BitMap.Height do begin
PBit := BitMap.ScanLine[y];
x := 0;
while x < BitMap.Width do begin
pBit[3x]
pBit[3x + 1]
pBit[3x + 2]
Inc(x, 1);
end;
Inc(y, 1);
end;


// pwDataBuffer : PPoint;
for y := 0 to (BitMap.Height - 1) do begin
PBit := BitMap.ScanLine[y];
for x := 0 to (BitMap.Width - 1) do begin
PWORD(Integer(pwDataBuffer) + (y * BitMap.Width + x) * 2)^
end;
end;
 
就是我从采集卡中得到位图,因为要实时监测,所以就准备在内存中直接辨识,而不是用楼上大侠的方法,如果我知道了数据的缓冲指针,也知道图是24位的,我如何一个象素一个象素的判断是否满足要求,比如找到一个白点在图中的位置。谢谢!
 
如果从采集卡中得到是位图(HBitmap),可以这样:
bmp : TBitmap;
bmp := TBitmap.Create;
bmp.Handle := HBitmap;
然后对bmp进行ScanLine操作即可实现一个象素一个象素的判断是否满足要求
 
得到指针还不简单吗,指针开始的就是位图结构数据呗,直接处理;
前提是了解位图结构。
对不
 
24bit的位图简单,每三个字节是一个象素点的颜色值,分别是Blue,Green和Red.
白色就是三个字节都为0的点。
 
哈哈,LeeChange 也有说错的时候啊,白色应该是三个字节都为 255 的点啊:)

lfeng15:
你是用 VFW 采集吗?用 capSetCallBackOnFrame 取得位图缓冲吗?
那么,你可以以如下方法将它转换为一个位图:

[1]
建立 bmpCap: ...
建立 infoCap: capGetVideoFormat(wndCap, @infoCap, sizeof(TBitmapInfo));
开始回调: capSetCallBackOnFrame(wndCap, procCap)

...

[2]
function procCap(hWnd:HWND; lpVHdr:PVIDEOHDR):LongInt; stdcall;
begin
result := 0;
if isLock then exit;
FrameToBitmap(bmpCap, lpvhdr^.lpData, infoCap);
end;

[3]
procedure FrameToBitmap(Bitmap: TBitmap; FrameBuffer: pointer; BitmapInfo: TBitmapInfo);
begin
if bitmapInfo.bmiHeader.BiCompression = bi_RGB then
with Bitmap do
setDiBits(canvas.handle, handle, 0, BitmapInfo.bmiHeader.biheight,
FrameBuffer, BitmapInfo, DIB_RGB_COLORS);
end;
 
hehe,是的吗?
编代码试了一下,果然是错了。[:D]
 
谢谢各位。的确要知道位图的结构。
 
后退
顶部