抓内存图 (100分)

  • 主题发起人 主题发起人 coao
  • 开始时间 开始时间
C

coao

Unregistered / Unconfirmed
GUEST, unregistred user!
使用WebBrower浏览ASP,抓取WebBrower内指定大小的内容,设WebBrower.Visible:=False,应该如何做?
以下代码抓出的BMP不对.
GetMem(bytesBuffer,BitSize);
fillChar(BytesBuffer^,BitSize,0);
hDC1:=GetDC(0);
MemBitmap:=CreateCompatibleBitmap(hDC1,iWidth,iHeight);
ShowBitMap:=CreateCompatibleBitmap(hDC1,iWidth,iHeight);
ReleaseDC(0, hDC1);
MemDC:=CreateCompatibleDC(0);
SelectObject(MemDC,MemBitMap);
hDC2:=CreateCompatibleDC(0);
SelectObject(hDC2,ShowBitMap);
SendMessage(wbBrow.Handle,WM_PRINT,MemDC,PRF_OWNED);
SetStretchBltMode(hDC2,STRETCH_HALFTONE);
StretchBlt(hDC2,0,0,iWidth*2,iHeight*2,MemDC,0,0,Width,Height,SrcCopy);
DeleteDC(MemDC);
DeleteObject(MemBitmap);

with SrcbmHeader do begin
biSize:=SizeOf(TBitmapInfoHeader);
biWidth:=iWidth;
biHeight:=iHeight;
biPlanes:=1;
biBitCount:=24;
biCompression:=BI_RGB;
end;

bi.bmiHeader:=SrcbmHeader;
if GetDIBits(hDC2,ShowBitMap,0,iHeight,BytesBuffer,bi,DIB_RGB_COLORS)=0 then
begin
showmessage('错误抓图'+inttostr(GetLastError));
end
else
begin
DeleteDC(hDC2);
DeleteObject(ShowBitMap);
MemFile:=TMemoryStream.Create;
MemFile.Write(BytesBuffer^,BitSize);
MemFile.SaveToFile('D:/a.bmp');
MemFile.Free;
end;
 
咦,怎么贴上去的无效?

采用TWebBrower浏览网页,但为了界面,所以不打算显示webBrower,所以Visible设为False
但是采用以下代码,抓取的东西不对。GetDIBits函数返回的buffer为空。

var
hDC1,hDC2,MemDC:HDC;
MemBitMap,ShowBitMap:HBitMap;
MemFile:TMemoryStream;
bi:PBITMAPINFO;
SrcBmHeader:TBitmapInfoHeader;
BytesBuffer:Pchar;
i,p:integer;
s:string;
begin
GetMem(bytesBuffer,BitSize);
fillChar(BytesBuffer^,BitSize,0);
hDC1:=GetDC(0);
MemBitmap:=CreateCompatibleBitmap(hDC1,iWidth,iHeight);
ShowBitMap:=CreateCompatibleBitmap(hDC1,iWidth,iHeight);
// ReleaseDC(0, hDC1);
MemDC:=CreateCompatibleDC(0);
SelectObject(MemDC,MemBitMap);
hDC2:=CreateCompatibleDC(0);
SelectObject(hDC2,ShowBitMap);
SendMessage(wbBrow.Handle,WM_PRINT,MemDC,PRF_OWNED);
SetStretchBltMode(hDC2,STRETCH_HALFTONE);
StretchBlt(hDC2,0,0,iWidth*2,iHeight*2,MemDC,0,0,iWidth,iHeight,SrcCopy);
// DeleteDC(MemDC);
// DeleteObject(MemBitmap);

{ with SrcbmHeader do begin
biSize:=SizeOf(TBitmapInfoHeader);
biWidth:=iWidth;
biHeight:=iHeight;
biPlanes:=1;
biBitCount:=24;
biCompression:=BI_RGB;
end;

bi.bmiHeader:=SrcbmHeader; }
bi^.bmiHeader.biSize:=SizeOf(TBitmapInfoHeader);
bi^.bmiHeader.biWidth:=iWidth;
bi^.bmiHeader.biHeight:=iHeight;
bi^.bmiHeader.biPlanes:=1;
bi^.bmiHeader.biBitCount:=24;
bi^.bmiHeader.biCompression:=BI_RGB;
bi^.bmiHeader.biSizeImage :=((bi^.bmiHeader.biWidth * longint(bi^.bmiHeader.biBitCount)) div 8) * bi^.bmiHeader.biHeight;
bi^.bmiHeader.biXPelsPerMeter:=0;
bi^.bmiHeader.biYPelsPerMeter:=0;
bi^.bmiHeader.biClrUsed:=0;
bi^.bmiHeader.biClrImportant:=0;

p:=GetDIBits(hDC2,ShowBitMap,0,iHeight,nil,TBitmapInfo(bi^),DIB_RGB_COLORS);
if p=0 then
exit;
i:=GetDIBits(hDC2,ShowBitMap,0,iHeight,BytesBuffer,TBitmapInfo(bi^),DIB_RGB_COLORS);
if i=0 then
begin
showmessage('错误抓图'+inttostr(GetLastError));
end
else
begin
for i:=0 to BitSize do
begin
s:=s+inttohex(ord(BytesBuffer),2);
end;
DeleteDC(hDC2);
DeleteObject(ShowBitMap);
MemFile:=TMemoryStream.Create;
MemFile.Write(BytesBuffer^,BitSize);
MemFile.SaveToFile('D:/a.bmp');
MemFile.Free;
end;
 
我晕。连贴两次都无效。

采用TWebBrower浏览网页,但为了界面,所以不打算显示webBrower,所以Visible设为False
但是采用建立内存DC及bitmap的方法,怎么抓取的东西不对。GetDIBits函数返回的buffer为空。
GetDIBits(hDC2,ShowBitMap,0,iHeight,BytesBuffer,TBitmapInfo(bi^),DIB_RGB_COLORS);
 
后退
顶部