Форум: "Прочее";
Текущий архив: 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