如何将网页中的图片拷贝到timage上去(100分)

  • 主题发起人 主题发起人 wanderld
  • 开始时间 开始时间
W

wanderld

Unregistered / Unconfirmed
GUEST, unregistred user!
如何将网页中的图片拷贝到timage上去
不使用idhttp类似的下载工具
希望直接从ihtmldocument和webbrowser中获得
网上流传的createControlRange,execCommand('Copy',False,EmptyParam)之后再从剪贴板中拷贝的方法不能实现,因为我发现这样拷贝出来并不是cf_bitmap格式
我也搞不清楚这样拷贝出来到底是什么格式
 
ihtmldocument中是图片的链接.

按你的意思,可以按照链接下载图片.但是这样同样保证不了格式.格式是网站自己定义的.
 
还是不要另行下载,这样很难保证下载时的参数,如reff , cookie一致
 
干脆,谁知道从ie上拷贝出来的东西能够在什么控件上粘贴,比如word可以粘贴,还有什么可以粘贴
 
知道照片的大小就可以
你可以参考附加码图片的取得

不过用idhttp最好
用webbrowser太浪费资源
1.把WebBrowser放到Panel上 Panel的大小是照片的大小
2.调整WebBrowser的位置 让照片刚好显示在Panel
3.取得Panel1的设备环境
4.创建位图对象 把Panel1的Handle赋给画布对象

抄点我刚学时候写的代码 现在这种方式很落后了,现在我直接用函数socket上然后HTTP协议把它从流中取出 根本不用装进Image就可以进行验证码识别 很落后的东西了,不过你喜欢用就拿去用:

var
myBmp:Tbitmap;
rect:Trect;
MyCanvas:Tcanvas;
dc:Hdc;
x, y: integer;
sBuffer: String;
srcBitmap: TBitmap;
MyItem:Olevariant;
Color: TColor;
r: byte;
ERR:integer;
wb1:TWebBrowser;
P1: TPanel;
BeginTick: DWORD;//计算超时
tempstr:string;
begin
ERR:=0;
P1:=TPanel.Create(self);
Form1.InsertControl(P1);

P1.Left:=0;
P1.Top:=0;
P1.Height:=16;
P1.Width:=48;

wb1:=TWebBrowser.CreateParented(p1.Handle);
P1.InsertControl(wb1);
wb1.OnDocumentComplete:=WBDocumentComplete;

wb1.Left:=0;
wb1.Top:=0;
wb1.Height:=20;
wb1.Width:=50;

CompleteNum:=0;
wb1.Navigate('http://验证码图片地址.bmp');
while wb1.ReadyState <READYSTATE_COMPLETE do Application.ProcessMessages;
wb1.Left:=P1.Left-strtoint(Edit1.Text);
wb1.Top:=P1.Top-strtoint(Edit2.Text);
wb1.Width:=P1.Width+strtoint(Edit1.Text);
wb1.Height:=P1.Height+strtoint(Edit2.Text);

myBmp := TBitMap.Create ;//创建位图对象
MyCanvas := TCanvas.Create ;//创建画布对象
rect := P1.ClientRect;//取边界
Dc := GetDc(P1.Handle);//取得Panel1的设备环境
myCanvas.Handle := dc;//赋给画布对象
Image1.Canvas.CopyRect(rect,myCanvas,Rect);
ReleaseDC(0 ,dc);

这样 就把验证码加载到Image1上了

学习网络编程 首先要理解七层的含义 这些WebBrowser和idhttp都是可有可无的东西
 
楼上的很N啊,好像挺喜欢用底层的做法实现
用拷贝dc的方法确实可以得到图片,但是提取链接后再navigate,不容易保证http头信息是否一致。我不太清楚webbrowser下载图片时reff,cookie等是否要根据所在页面的参数调整,不过最好不再另外下载
 
http://www.2ccc.com/article.asp?articleid=1423
 
取得图片的连接,将其下载到TStream中或者文件中,然后再装载到Image中,不过这样的话你必须支持几个插件:
TGifImage,TPngImage。这些网络上都有
 
上面的贴子已经说明,最好用ie的另存为功能
 
取缓存中文件方法,不用复制方法

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;
 
多人接受答案了。
 
后退
顶部