При использовании TWebBrowser на Delphi часто требуется работать с изображениями, которые загрузил TWebBrowser. Фактически самыми востребованными функциями будет получение списка URL картинок текущей загруженной страницы, получение параметров заданного изображения, получение изображения из кэша TWebBrowser без повторного выкачивания изображения из сети. Эти функции мы и обсудим в этой статье.
Список URL изображений из текущей загруженной страницы
TWebBrowser можно получить такой функцией:
uses mshtml, OleCtrls, SHDocVw;
procedure GetBrowserImageURLs(Browser: TWebBrowser; List: TStringList);
var i: integer;
ImageHref: string;
begin
List.Clear;
for i := 0 to Browser.OleObject.Document.Images.Length - 1 do
begin
ImageHref := Browser.OleObject.Document.Images.Item(i).Href;
if (ImageHref <> '') and (List.IndexOf(ImageHref) < 0) then
List.Add(ImageHref);
end;
end;
Результат со списком URL будет в List. Если требуется получить другие дополнительные параметры изображения, то можно модифицировать приведенный выше код и использовать следующие свойства Item(i):
Width - Ширина изображения в пикселах
Height - Длина изображения в пикселах
FileSize - Размер файла в байтах
Alt - Текст тега ALT
Следующей задачей является получение самого изображения без повторного его выкачивания из сети по URL. Автору известен способ сделать это используя буфер обмена Windows. Приведенная ниже функция ищет изображение по заданному URL и возвращает
Bitmap в экземпляр объекта
TImage:
uses ExtCtrls, mshtml, OleCtrls, ClipBrd, SHDocVw;
function GetBrowserImage(Browser: TWebBrowser; url: string; Image: TImage): boolean;
var body, imgs, controlRange: olevariant;
i: integer;
ImageHref: string;
begin
Result:=false;
body := Browser.OleObject.document.body;
for i := 0 to Browser.OleObject.Document.Images.Length - 1 do
begin
ImageHref := Browser.OleObject.Document.Images.Item(i).Href;
if ImageHref=url then
begin
imgs := Browser.OleObject.document.images.item(i);
controlRange := body.createControlRange;
controlRange.add(imgs);
controlRange.execCommand('Copy', False, EmptyParam);
try
if ClipBoard.HasFormat(CF_BITMAP) then
begin
Image.Picture.Bitmap.LoadFromClipboardFormat(cf_BitMap, ClipBoard.GetAsHandle(cf_Bitmap), 0);
Result:=true;
end;
except
end;
Exit;
end;
end;
end;
Если изображение успешно загружено, то функция возвращает
true, иначе
false. Изображение может не быть загружено в том случае, если в
TWebBrowser отключена загрузка изображений. В этом случае можно загрузить изображение непосредственно по его URL из сети, например, при помощи
TIdHTTP.
Для сохранения изображения в файл из
TImage можно воспользоваться модулем
JPEG Delphi:
uses ExtCtrls, JPEG;
procedure SaveImageToJpeg(Image: TImage; FileName: string);
var jpg: TJPEGImage;
begin
jpg:=TJPEGImage.Create;
try
jpg.Assign(Image.Picture.Bitmap);
jpg.SaveToFile(FileName);
finally
jpg.Free;
end;
end;
В качестве примера использования приведенных выше функций можно привести задачу получения изображения каптчи с текущей страницы TWebBrowser в автоматическом режиме.
Изображения каптчи можно получить без повторного выкачивания его из сети, если включена загрузка изображений в TWebBrowser при помощи GetBrowserImage, и выкачивая его непосредственно из сети, если загрузка отключена (при помощи IdHTTP). При таком подходе можно иметь всегда актуальную каптчу, ведь не секрет, что многие каптчи при повторном выкачивании дадут уже совсем другое изображение, отличное от того, что вы видите в TWebBrowser.
Смотрите также:
Оставьте свой комментарий
Вы должны быть авторизированны, чтобы оставить комментарий.