FoxBase!
msgbartop
Блог Oracle разработчика
msgbarbottom
foxbase

25.04.2011 Работаем с изображениями в TWebBrowser на Delphi

изображения TWebBrowser
При использовании 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. 

www.foxbase.ru


Смотрите также:



Оставьте свой комментарий

Вы должны быть авторизированны, чтобы оставить комментарий.