Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.02.27;
Скачать: [xml.tar.bz2];

Вниз

скриншот отдельного элемента страницы загруженной в IE ...   Найти похожие ветки 

 
hattak ©   (2010-11-16 01:32) [0]

Возник вопрос, как сделать скриншот отдельного элемента страницы, фрейма или картинки из страницы загруженной в Internet Explorer?

Как сделать скриншот документа в принципе понятно:

var IE:IWebBrowser2;
    ViewObject:IViewObject;
    BMP:TBitMap;
    R:TRect;
..........
IE.Document.QueryInterface(IViewObject, ViewObject);
BMP := TBitmap.Create;
R := Rect(0, 0, IE.Width, IE.Height);
BMP.Height := IE.Height;
BMP.Width := IE.Width;
ViewObject.Draw(DVASPECT_CONTENT, 1, nil, nil, IE.HWND, BMP.Canvas.Handle, @r, nil, nil, 0);
BMP.SaveToFile("screenshot.bmp");
BMP.Free;
ViewObject._Release;
..........................

а как сделать скриншот отдельного фрейма или картинки?


 
Димка На   (2010-11-16 05:22) [1]

Ну уверен точно. Может попросить IViewObject у элемента, а не у документа?


 
hattak ©   (2010-11-16 09:51) [2]

да я пытался, нет даёт он его от элемента(


 
sniknik ©   (2010-11-16 10:18) [3]

> R := Rect(0, 0, IE.Width, IE.Height);
это называется просто добавь воды... в смысле подставь координаты.


 
hattak ©   (2010-11-16 22:29) [4]

sniknik ©  нет уж))) не всё так просто))) а если картинка, находится все видимой части окна, ну ниже не странице ...

нашёл кое-что про это, а именно:

uses
 MSHTML, WinInet;

type
 IHTMLElementRender = interface(IUnknown)
   ["{3050F669-98B5-11CF-BB82-00AA00BDCE0B}"]
   function DrawToDC
     ( _hDC:                      HDC
     ): HResult; stdcall;
 end;

procedure SaveImageFromIHtmlDocument2(AIHtmlDocument2: IHtmlDocument2; const ADir: string);
var Images: IHTMLElementCollection;
   i: Integer;
   ImgElement: IHTMLImgElement;
   URL: string;
   Buff: Pointer;
   BuffSize: DWORD;
   CacheName: string;
   NewName: string;
   P: Integer;
   ElementRender: IHTMLElementRender;
   Bitmap: TBitmap;
begin
 if not Assigned(AIHtmlDocument2) then exit;
 Images := AIHtmlDocument2.images;
 if not Assigned(Images) then exit;

 for i := 0 to Images.length - 1 do
 if Succeeded(Images.item(i, 0).QueryInterface(IHTMLImgElement, ImgElement)) then
 try
   CacheName := "";
   URL := ImgElement.src;
   NewName := URL;
   P := LastDelimiter("/", NewName);
   if P > 0 then Delete(NewName, 1, P);
   NewName := ADir + NewName;
   Buff := nil;
   BuffSize := 0;
   if not RetrieveUrlCacheEntryFile(PChar(URL), TInternetCacheEntryInfo(Buff^), BuffSize, 0) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then
   begin
     GetMem(Buff, BuffSize);
     try
       if RetrieveUrlCacheEntryFile(PChar(URL), TInternetCacheEntryInfo(Buff^), BuffSize, 0) then
       try
         if Succeeded(ImgElement.QueryInterface(IHTMLElementRender, ElementRender)) then
         try
           Bitmap := TBitmap.Create;
           try
             with ImgElement as IHTMLElement, Bitmap, Canvas do
             begin
               Width := offsetWidth;
               Height := offsetHeight;
               Brush.Color := clWhite;
               FillRect(ClipRect);
               ElementRender.DrawToDC(Handle);
             end;
           finally
             Bitmap.Free;
           end;
         finally
           ElementRender := nil;
         end;
       finally;
       end;
     finally
       ImgElement := nil;
     end;
   end;
 finally
 end;
end;

в основе интерфейс IHTMLElementRender
но, он не прописан у меня в MSHTML (D7)
тут вот его предлагается определить вручную ..
но, не работает, при попытке получить этот интерфейс всё заканчивается неудачей ... хотя в нескольких местах этот код представлен и написано, что всё работает ... у кого-то может есть информация про этот интерфейс, что тут не так, почему неполучается его получить?


 
hattak ©   (2010-11-16 22:34) [5]

ещё один вариант:

const
 IID_IHTMLElementRender: TGUID = "{3050F669-98B5-11CF-BB82-00AA00BDCE0B}";

type
 IHTMLElementRender =  interface(IUnknown)
   ["{3050F669-98B5-11CF-BB82-00AA00BDCE0B}"]
   function DrawToDC(_hDC: HDC): HResult; stdcall;
   function SetDocumentPrinter(bstrPrinterName: WideString; _hDC: HDC): HResult; stdcall;
 end;

function GetBitMapFromInterface(Int: IUnknown): TBitMap;
var
 Render: IHTMLElementRender;
 Image: IHTMLImgElement;
begin
 Result := nil;
 if Int = nil then
   Exit;
 if Int.QueryInterface(IHTMLImgElement, Image) <> S_OK then
   Exit;
 if Image.QueryInterface(IHTMLElementRender, Render) <> S_OK then
   Exit; // Тут вываливается
 if Render = nil then
   Exit;
 if (Image.Width < 1) or (Image.Height < 1) then
   Exit;
 Result := TBitMap.Create;
 Result.Width := Image.Width;
 Result.Height := Image.Height;
 Result.PixelFormat := pf24bit;
 Render.DrawToDC(Result.Canvas.Handle);
end;

и опять же IHTMLElementRender и не работает ((


 
sniknik ©   (2010-11-17 01:00) [6]

> а если картинка, находится все видимой части окна, ну ниже не странице ...
то это не уже не будет скриншотом...

но вообще картинка это не скриншот, это обьект, его можно просто скопировать (разница, если бы был скриншот то перекрытие чем нибудь другим тоже бы "заснялось", а так нет)

в [4] все нормально, имена определяет, картинки копирует, единственное запись в файл отсутствует...

> и опять же IHTMLElementRender и не работает ((
а с чего ему работать? берешь "главный" интерфейс и считаешь его картинкой почему то... сравни хотя бы с первым кодом, по сути это одно и тоже, только в первом "проход" по картинкам и запись (отсутствующая но подразумевающаяся, иначе зачем до этого имя файла определялось...) в файл. во втором в запись одного в битмап, но с неверным начальным определением откуда.


 
hattak ©   (2010-11-17 17:51) [7]

2 sniknik ©

извини, но не понимаю, что значит "берешь "главный" интерфейс и считаешь его картинкой почему то" ? я пытаюсь взять интерфейс от картинки именно, хорошо ...

type
IHTMLElementRender =  interface(IUnknown)
  ["{3050F669-98B5-11CF-BB82-00AA00BDCE0B}"]
  function DrawToDC(_hDC: HDC): HResult; stdcall;
  function SetDocumentPrinter(bstrPrinterName: WideString; _hDC: HDC): HResult; stdcall;
end;

var IE:IWebBrowser2;
   u,v:OLEVariant;
   iDoc,iiDoc:IHTMLDocument2;
   images:IHTMLElementCollection;
   img:IHTMLImgElement;
   imgR:IHTMLElementRender;
   i:integer;

.............

CoCreateInstance(StringToGUID("{0002DF01-0000-0000-C000-000000000046}"), nil, CLSCTX_LOCAL_SERVER, IWebBrowser2, IE);
IE.Visible := true;
u := "http://yandex.ru";
IE.Navigate2(u,v,v,v,v);
while IE.ReadyState <> READYSTATE_COMPLETE do application.ProcessMessages;
IE.Document.QueryInterface(IHTMLDocument2,iDoc);
if assigned(iDoc) then
  begin
   images := iDoc.images;
   for i := 0 to images.length - 1 do
    begin
     images.item(i,"").QueryInterface(IHTMLImgElement,img);
     if assigned(img) then
       begin
        img.QueryInterface(IHTMLElementRender,imgR);
        if assigned(imgR) then
          begin
           form1.Memo1.Lines.Append("OK:" + img.src);
          end else form1.Memo1.Lines.Append("ERR: "+img.src);
       end;
    end;
  end;
iDoc.close;

................
получаем интерфейс документа,
берём коллекцию кортинок,
берём картинку (images.item(i,"").QueryInterface(IHTMLImgElement,img);),
запрашиваем от неё  img.QueryInterface(IHTMLElementRender,imgR);

результат:
ERR: http://yabs.yandex.ru/count/ALIBMVGtKaG40002ZhsiFiu4KPK2cmLfMeYhRrO6agAEMHEAhHPY3QMM66IHlD19P0QJXmsBfcIUUK5_ 1G00
ERR: http://img.yandex.net/i/www/logo.png
ERR: http://img-fotki.yandex.net/getx/10000/photoface.321/jul79_307301_teaser
ERR: http://yabs.yandex.ru/count/ALIBMMujxYi40002ZhsiFiu4KPK3cmLjL8YcTGJmag0VWHIAeCa_3gMNKjAHlD19P0QJXmsBgmOrZK6C XhYWXhXz1W00
ERR: http://img.yandex.net/i/wizn6.png
ERR: http://mc.yandex.ru/watch/722545
ERR: http://yabs.yandex.ru/count/ALIBMTmDdha40000ZhsiFiu4KP6yq4ba1fE73NW2=9vDjcPK2cmLfMfAYZbaJUm40=9XZj1vK3cmLjL9 AW7u4Ke8QuVW40

в чём ошибка-то? от чего же нужно запрашивать этот интерфейс?


 
sniknik ©   (2010-11-17 18:10) [8]

> что значит "берешь "главный" интерфейс и считаешь его картинкой почему то" ? я пытаюсь взять интерфейс от картинки именно, хорошо ...
в первом варианте (правильном) -

 Images := AIHtmlDocument2.images; //от переданного, главного получаем список картинок

 for i := 0 to Images.length - 1 do //бежим по списку, обрабатываем каждую  
   if Succeeded(Images.item(i, 0).QueryInterface(IHTMLImgElement, ImgElement)) then

во втором
 if Int.QueryInterface(IHTMLImgElement, Image) <> S_OK then
от переданного, главного первый же элемент считаем картинкой...


 
hattak ©   (2010-11-17 18:27) [9]

ну я в [7] так и написал же, как в "правильном"

IE.Document.QueryInterface(IHTMLDocument2,iDoc);
images := iDoc.images;
images.item(i,"").QueryInterface(IHTMLImgElement,img);

только от него, от img, всё равно не берётся
img.QueryInterface(IHTMLElementRender,imgR);


 
hattak ©   (2010-11-17 23:36) [10]

хорошо, сформулируем вопрос иначе)))
чёрт с ним, с этим интерфейсом))

как можно ещё сохранить картику из страницы,
загруженной в IE/TWebBrowser без её повторной закачки?)


 
sniknik ©   (2010-11-18 08:47) [11]

в TWebBrowser, первый приведенный тобой вариант. только добавить собственно сохранение.
IE не проверял.


 
hattak ©   (2010-11-18 20:19) [12]

к сожалению, ни первый ни какой вариант с IHTMLElementRender в IE не работает( может есть ещё какие-то варианты получения картинок, уже загруженным в IE?



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2011.02.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.003 c
15-1289644609
ixen
2010-11-13 13:36
2011.02.27
Локализация DevExpress


15-1290162602
VirEx(work)
2010-11-19 13:30
2011.02.27
TListBox перерисовка


15-1289831257
R_e_T_r_O
2010-11-15 17:27
2011.02.27
Записать из делфи в эксель


6-1201379773
Max.66RUS
2008-01-26 23:36
2011.02.27
Отправка файла POST-запросом...


2-1291389620
Василий Иванович
2010-12-03 18:20
2011.02.27
Поиск ключа в реестре.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский