如何保存WebBrowser内的图片(100分)

  • 主题发起人 主题发起人 全文检索
  • 开始时间 开始时间

全文检索

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,如何得到或保存WebBrowser内的图片.

试过在IE缓存中找,找到了,但是无法COPY出来

但是不能用从网页源码里找图片的 URL,这是一个验证码,每次都不同.

如 http://verify.qq.com/getimage?0.002926716948551733

这是腾讯的验证码图片


我不想WebBrowser在程序中可见,但要显示这个验证码图片,怎么办
 
没经验,顶
 
uses SHDocVw, WinINet, MsHtml;
//获取IE缓存验证码的图片
Function TFrmMain.GetLocalImg(Bitmap: TBitmap): boolean;
Var
lpEntryInfo: PInternetCacheEntryInfo;
dwEntrySize, dwLastError, Hwd: LongWORD;
Begin
result := false;
IsStop := true;
dwEntrySize := 0;
FindFirstUrlCacheEntry(Nil, TInternetCacheEntryInfo(Nil^), dwEntrySize);
GetMem(lpEntryInfo, dwEntrySize);
Hwd := FindFirstUrlCacheEntry(Nil, lpEntryInfo^, dwEntrySize);
If Hwd <> 0 Then
Begin
Repeat
dwEntrySize := 0;
FindNextUrlCacheEntry(Hwd, TInternetCacheEntryInfo(Nil^), dwEntrySize);
dwLastError := GetLastError();
If dwLastError = ERROR_INSUFFICIENT_BUFFER Then
Begin
GetMem(lpEntryInfo, dwEntrySize);
If FindNextUrlCacheEntry(Hwd, lpEntryInfo^, dwEntrySize) Then
Begin
If Pos(UpperCase('qq.com/getimage?'), UpperCase(lpEntryInfo.lpszSourceUrlName)) > 0 Then
If (FileExists(lpEntryInfo.lpszLocalFileName)){ And (UpperCase(ExtractFileExt(lpEntryInfo.lpszLocalFileName)) = '.BMP')} Then
Begin
Bitmap.FreeImage; //加载验证码BMP图片
Bitmap.LoadFromFile(lpEntryInfo.lpszLocalFileName);
result := true;
End;
If Pos(UpperCase('qq.com'), UpperCase(lpEntryInfo.lpszSourceUrlName)) > 0 Then
DeleteUrlCacheEntry(lpEntryInfo.lpszSourceUrlName); //删除所有属于QQ的缓存网页
End;
End;
Application.ProcessMessages;
Until (dwLastError = ERROR_NO_MORE_ITEMS);
End;
FreeMem(lpEntryInfo);
FindCloseUrlCache(Hwd);
IsStop := false;
End;

//demo
WebBrowser1.Navigate('http://freeqq2.qq.com/2.shtml');
While WebBrowser1.ReadyState <> READYSTATE_COMPLETE Do Application.ProcessMessages;
GetLocalImg(Image1.Picture.Bitmap);

//=============================================================

//另一种方式直接取本地IE缓存文件
Function GetUrlCacheLocalFileName(UrlName: String; Var LocalFName: String): boolean;
Var
lpCacheEntryInfo: PInternetCacheEntryInfo;
DSize: Cardinal;
Begin
result := false;
DSize := 0;
GetUrlCacheEntryInfo(PChar(UrlName), lpCacheEntryInfo^, DSize);
GetMem(lpCacheEntryInfo, DSize);
Try
If GetUrlCacheEntryInfo(PChar(UrlName), lpCacheEntryInfo^, DSize) Then
Begin
LocalFName := lpCacheEntryInfo.lpszLocalFileName;
result := true;
End;
Finally
FreeMem(lpCacheEntryInfo, DSize);
End;
End;

//demo
var Lf:string;
Begin
if GetUrlCacheLocalFileName('http://verify.qq.com/getimage?0.002926716948551733',Lf) then
Image1.Picture.Bitmap.LoadFromFile(Lf);
End;
 
谢谢 风铃夜思雨

测试第一种为
错误:
Bitmap image is not valid ( 位图无效 )
已经让WebBrowser在完全打开网页的情况下GetLocalImg(Image1.Picture.Bitmap);

再试下第二种
 
to 风铃夜思雨
C:/Documents and Settings/xiaoyuwed/Local Settings/Temporary Internet Files/Content.IE5/2PKFCPED/getimage[2].png

两种方法都可行,能返回正确路径,但无论如何是载入不了图片

(png控件已安装,能支验证码图片的格式)
 
似乎那个图片是frame框架里的吧
 
to anyway

这个图片已存在了,缓存里

如果有办法可以复制到其它地方也行
 
另外开贴给分,复制文件到另一位置

http://www.delphibbs.com/delphibbs/dispq.asp?lid=3513519
 
由于之前我的代码是用于加载BMP格式的验证码

你可以用TMemoryStream流方法加载到流中,如果有PNG控件,可以转换为相应图片格式等

可以用TMemoryStream流方法加载到流中,再另存为到其它路径下
 
非常感谢 风铃夜思雨

http://www.delphibbs.com/delphibbs/dispq.asp?lid=3513519
这里还有一贴麻烦进一下,我好结贴。
 
后退
顶部