for i := 0 to doc.images.length - 1 do
begin
if (doc.images.item(i, i) as IHTMLImgElement).src = url then
begin
Image1.Picture.Bitmap.Width := (doc.images.item(i, i) as
IHTMLImgElement).width;
Image1.Picture.Bitmap.Height := (doc.images.item(i, i) as
IHTMLImgElement).height;
finded := doc.images.item(i, i) as IHTMLElement;
break;
end;
end;
if finded <> nil then
begin
body := WB.OleObject.document.body;
ControlRange := body.createControlRange;
ControlRange.add(finded);
ControlRange.execCommand('Copy', False, EmptyParam);
if ClipBoard.HasFormat(CF_BITMAP) then
begin
Image1.Picture.Bitmap.LoadFromClipboardFormat(CF_BITMAP,
ClipBoard.GetAsHandle(CF_BITMAP), 0);
end;
end;
Delphi 7 Webbrowser вызов процедурки "save as...." КАК?
Все вы знаете, что если в IE на загруженом сайте правой кнопкой мыши щелкнуть по рисунку выплывет минюшка в которой будет команда save as(сохранить рисунок как...). После чего выскакивает диалоговое окно, где вы говорите куда ее сохранить и под каким именем....
Так вот мне это нужно сделать програмно........ (ПРИЧЕМ ИМЕННННННННО ЭТО!)
Я не могу просто скачать этот рисунок с сервера....
И не могу скопировать его в буффер, а после через image сохранить на диск.....
(потому, что после с этим рисунком нельзя правильно работать, а вот когда его через "сохранить как", то ошибок после в работе с риссунком не возникает - это мне и нужно....)
нужна команда что то вроде Web1.OleObject.Document.frames.item(3).document.frames.item(0).document.images.item(4).savetofile('c:\\1.bmp');
Или как то вызвать именно эту функцию (сохранить как, уже с заданными параметрами(с:\1.бмп) )
П.с. Web1.OleObject.Document.frames.item(3).document.frames.item(0).document.images.item(4) - это точный путь к рисунку.
Помогите плизззз.
С английским у меня плоховато... Так что плиз не посылайте меня на msdn....
ищешь этот объект используя DOM HTML, выдираешь адрес, и спокойненько "кушаешь" его используя какой-нибудь компонент (idHTTP например с вкладки Indy)
По этому, есть только один вариант - вынимать его из самого броузера...
Но вот как????
Вернее вынимать то его получается черз
Image1.Picture.Bitmap.LoadFromClipBoardFormat(cf_Bitmap, ClipBoard.GetAsHandle(cf_Bitmap), 0);//вставляем
но через это работать нельзя... Что то с кодировкой рисунка происходит...Перекодировать тоже нельзя....
Так что единственный способ, который отвечает требованиям задачи - это через стандартную функцию ИЕ "Сохранить риссунок как...", только программным способом без задания адресса пути(имени файла)....
Но вот как это сделать?????
Код:
Вот такой вот код для нахождения картинки по урлу, копированию в буфер, а потом из буфера в битмап. Далее можешь делать, что хочется - отображать, сохранять на диск или ещё что-то.
P.S. Код не моего авторства и автора я не знаю, но хотелось бы выразить ему благодарность за решение (искали всем миром и идеи были, в принципе, одинаковы, но вот решение далось не всем).
Хоть он и копирует, но проблема в том, что кодировка не сохраняется....(формат рисунка, рисунок можно посмотреть, он схож на все 100% по пискелям, размеру, формату, НО При открытии этого рисункаи сохраненного в ручную с помощью НОТЕПАДА - в глаза сразу бросается разница :( ) - по этому я не могу работать с этим рисунком, мне нужно что бы он сохранялся в точности, как это делается в ручную....
Я этот код уже давно нашел, и пробывал.....
Я же говорю, нужна стандартная процедурка от IE, "сохранить рисунок как..." - только она делает правильное копирование....
круть =)
Вот, что люди писали на других форумах, может это вам поможет, что бы понять, эту проблему...
--------------------------------------------------------------
ratttx
Да кстати пробывал еще такой кодик...... использовать....
try
Web1.ExecWB(4, 0);
except
Хех - сайт он сохранил, причем с глюками и причем ВЕСЬ :(((( Только вот того, что мне нужно, не сохранил.....
Так что такой вариант тоже не подходит...(если только у меня руки не кривые, и я не забыл несколько параметров добавить....)
Кстати говоря - мой вопрос весьма актуальный в интернете.... И на него нет еще нормального достойного ответа на русском языке ;)
--------------------------------------------------
andycount
Ему надо вызвать не стандартный диалог сохранения фала а диплог из MSHTML.
-------------------------------------------------------
P.S. Кстати, а как ты через Notepad сохранял картинку? И причём тут кодировка?
Я сохранял картинку многими способами(програмными,, один из них описан выше...) и в ручную, после чего сравнивал картинки открывая их через НОТЕПАД... И в итоге они различаются... :( а на счет, что способа нет, это врятли - должен быть.... Или этой функции бы небыло....
Если способ всё же отыщется - буду только рад. Я же не нашёл даже просто возможности пнуть активэкс с командой сохранения какого-либо элемента. Всю страницу - пожалуйста. Один элемент - кукиш.
У кого-нибудь есть идеи, как можно отследить действия IE во время сохранения рисунка? (Самая глупая идея, которая мне на ум пришла....)
Кстати говоря, этот вопрос ОЧЕНЬ актуален в интернете!!!!!!!!!!!
И в нем нуждаются многие.... Так что призываю людей способных помочь большинству решить этот вопрос о помощи..... (Надежда на умных, уже все надежды на всех форумах иссякли.. :( )
/*4:26 утра.... чокнутый :D*/
если честно... то мозг уже не варит......
могу рассказать идею:
значится создать HTML-ку (типа хак документ...) он будет являться оберткой....
значится внутри него, js и iframe.... то есть все Navigate твоего CppWebBrowser'а ты перенапрявляешь в этот iframe..... ну соотвессна растяни его там не знаю... на всю страницу... чтобы было похоже что это и есть документ ;) дальше....
значится в ifram'е на onload (если щаз не ошибаюсь... ща псмтарю....) да... точно на OnLoad в iframe ставишь следующую функцию.....
[html]
<script>
function SaveImage() {
if (typeof document.getElementById(iframe_id).window.document.images[image_index] == 'object') {
imgOrURL = document.getElementById(iframe_id).window.document.images[image_index].src;
document.getElementById("win").location = imgOrURL;
setTimeout('document.getElementById("win").document.execCommand("SaveAs")', 10);
}
}
</script>
[/html]строчка document.getElementById("win").location = imgOrURL; - WIN это твой второй IFRAME с id="win", невидимый, чтобы открывать в нем рисунки для сохранения ;)
строчка setTimeout('document.getElementById("win").document.execCommand("SaveAs")', 10); - тут точно не скажу, но почитай здесь про комманду SaveAs... ну всмысле спрятать диалог... и имя файла по умолчанию...
вот как бы вот такая идея... но реализовать я её, простите, в данный момент не в состоянии......... о как.... если сможете, и идейка чем-то помогла... то гут... если нет... ну нет так нет.... жаль конечно будет )
PS: с утра встану, буду тож пробовать... но ничего не обещаю ..... ) давно Дельфи не юзал
а счась спаааать .....
Функция скорее всего сработает, только вот чет я ее на дельфи перевести не могу :(
Цитата: ratttx
Функция скорее всего сработает, только вот чет я ее на дельфи перевести не могу :(
эту функцию надо вставить в свою HTML-обертку =)
PS: я вот встал водички попить ) решил заглянуть )
Эта функция сохраняет весь сайт, как я понял... (Вернее невидемый фрейм...), так вот, я уже пытался сохранить ВЕСЬ сайт...... Используя эту команду... web1.ExecWB(4,0); Так вот он сохранил ВСЕ, кроме того, что мне нужно все фреймы, все картинки, НО ТУ КАРТИНКУ, которая мне нужна не сохранил :( Я не знаю, как ИЕН сохраняет, своей процедуркой, но вот ее нам и нужно вызвать.....
Цитата: ratttx
сравнивал картинки открывая их через НОТЕПАД... И в итоге они различаются... :(
Вот исходник попробуй...
Цитата: Toxin_F
Вот исходник попробуй...
за работающий исходник спасибо и респект, а вот за трояна с сайта, указанного по умолчанию, можно и навалять пи###лей, так что всё уважение к автору как рукой сняло
Цитата: .nornad
Буквально две недели назад переполошили полрунета этим вопросом. :)
Вот такой вот код для нахождения картинки по урлу, копированию в буфер, а потом из буфера в битмап. Далее можешь делать, что хочется - отображать, сохранять на диск или ещё что-то.
P.S. Код не моего авторства и автора я не знаю, но хотелось бы выразить ему благодарность за решение (искали всем миром и идеи были, в принципе, одинаковы, но вот решение далось не всем).
Код:
for i := 0 to doc.images.length - 1 do
begin
if (doc.images.item(i, i) as IHTMLImgElement).src = url then
begin
Image1.Picture.Bitmap.Width := (doc.images.item(i, i) as
IHTMLImgElement).width;
Image1.Picture.Bitmap.Height := (doc.images.item(i, i) as
IHTMLImgElement).height;
finded := doc.images.item(i, i) as IHTMLElement;
break;
end;
end;
if finded <> nil then
begin
body := WB.OleObject.document.body;
ControlRange := body.createControlRange;
ControlRange.add(finded);
ControlRange.execCommand('Copy', False, EmptyParam);
if ClipBoard.HasFormat(CF_BITMAP) then
begin
Image1.Picture.Bitmap.LoadFromClipboardFormat(CF_BITMAP,
ClipBoard.GetAsHandle(CF_BITMAP), 0);
end;
end;
begin
if (doc.images.item(i, i) as IHTMLImgElement).src = url then
begin
Image1.Picture.Bitmap.Width := (doc.images.item(i, i) as
IHTMLImgElement).width;
Image1.Picture.Bitmap.Height := (doc.images.item(i, i) as
IHTMLImgElement).height;
finded := doc.images.item(i, i) as IHTMLElement;
break;
end;
end;
if finded <> nil then
begin
body := WB.OleObject.document.body;
ControlRange := body.createControlRange;
ControlRange.add(finded);
ControlRange.execCommand('Copy', False, EmptyParam);
if ClipBoard.HasFormat(CF_BITMAP) then
begin
Image1.Picture.Bitmap.LoadFromClipboardFormat(CF_BITMAP,
ClipBoard.GetAsHandle(CF_BITMAP), 0);
end;
end;
Вот такой вот код для нахождения картинки по урлу, копированию в буфер, а потом из буфера в битмап. Далее можешь делать, что хочется - отображать, сохранять на диск или ещё что-то.
P.S. Код не моего авторства и автора я не знаю, но хотелось бы выразить ему благодарность за решение (искали всем миром и идеи были, в принципе, одинаковы, но вот решение далось не всем).
а есть ли у этого кода описание переменных, а то не везде ясно какого типа должна быть переменная, а кусок (doc.images.item(i, i) as IHTMLImgElement).src компилятор вообще ругается благим матом