Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.05.2013, 23:14
cyborgg4655 cyborgg4655 вне форума
Начинающий
 
Регистрация: 16.03.2013
Сообщения: 151
Версия Delphi: Delphi 2010
Репутация: 10
Восклицание Размер картинки <img src="/items/phone..>

Помоги плз, никак немогу найти инфу как можно програмно определить размер картинки такого вида:
Код HTML:
<img src="/items/phone/samara_sobaki_schenki_jorki_s_dokumentami_57176555?pkey=093ecb0b20a5a526746cdef803de025c"/>
Код:
procedure TForm1.Button4Click(Sender: TObject);
var
  doc: IHTMLDocument2;
  i: Integer;
  img: IHTMLImgElement;
begin
  doc:=WebBrowser1.Document as IHTMLDocument2;
  for i:=0 to doc.all.length-1 do
    if doc.all.item(i, 0).QueryInterface(IID_IHTMLImgElement, img)=S_OK then
    if img.width=121 then
      memo1.Text:=img.fileSize;
end;
Не прокатывает, т.к картинка формуриются при помощи ява скрипта, который канначает рандомный ключ, потом инфо с этим ключем отправляется в виде GET запроса на сервер и после этого появляется картинка. В свойствах через оперу размер я вижу, а в свойствах Webbrowsera(когда правой кнопкой щелкаю по картинке) размер не распознается, кстати катинка эта в формате PNG.
Ответить с цитированием
  #2  
Старый 11.05.2013, 02:35
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

А в img что-то есть или он пустой? Если Webbrowser всё же получает картинку, то тогда вариант такой - брать её из кэша.

Код:
uses 
 WinInet;

function GetCacheFileName(const Url: string; var FileName: string): Boolean;
var
 Info: PInternetCacheEntryInfo;
 InfoBufSize: Cardinal;
begin
 Result := False;
 InfoBufSize := 0;
 GetUrlCacheEntryInfo(PChar(Url),
   TInternetCacheEntryInfo(nil^), InfoBufSize);
 if GetLastError = ERROR_INSUFFICIENT_BUFFER then begin
   GetMem(Info, InfoBufSize);
   try
     Result := GetUrlCacheEntryInfo(PChar(Url),
                 TInternetCacheEntryInfo(Info^), InfoBufSize);
     if Result then begin
       FileName := Info^.lpszLocalFileName;
     end;
   finally
     FreeMem(Info);
   end;
 end;
end;
//(c) Nikolai Adrianov
Если файл такой в кэше есть, функция вернёт true, а в FileName будет имя файла. А дальше делай с ним что хошь, в смысле, можно узнать размерчик. Может прокатит
Ответить с цитированием
  #3  
Старый 11.05.2013, 12:31
cyborgg4655 cyborgg4655 вне форума
Начинающий
 
Регистрация: 16.03.2013
Сообщения: 151
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

А подкскажи как ее использовать на примерчике?)
А то ошибка одолела(
[DCC Error] Unit1.pas(125): E2197 Constant object cannot be passed as var parameter
Делаю так:
Код:
procedure TForm1.Button5Click(Sender: TObject);
//var s:string;
begin
//s:=edit1.Text;
GetCacheFileName(edit1.Text,'5570fae99e97c793fb7443cbd43753d8.png');
end;
Ответить с цитированием
  #4  
Старый 11.05.2013, 16:20
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Здесь нужно запомнить одно простое правило, если используемая функция или процедура в своих параметрах для запуска содержит ключевое слово var, то с этой переменной нужно работать не на прямую, а передавать ей переменную соответствующего типа, поскольку после того как процедура или функция эта отработает, в "заваренной" переменной будет лежать выходной результат. Это действует всегда и везде.

Конкретно с примером - ведь начиналось всё правильно, зачемто отключена s типа string, в код передается константная величина в одинарных кавычках ('*.png'), которую нельзя изменить во время работы, вот компилятор как раз на это (E2197) и ругается. А решается очень просто

Код:
procedure TForm1.Button5Click(Sender: TObject);
var 
s:string;
begin
// edit1.Text должен содержать ответ на GET запрос, содержащий адрес картинки на сервере в сети

// используем основной результат функции который по определению типа boolean 
if GetCacheFileName(edit1.Text, s) then 
   Image1.Picture.LoadFromFile(s) //вернула true, т.е. файл в кэше есть, в s её имя на диске
 else 
   ShownMessage('Файл получить не удалось, пичалька'); // вернула false, нету файла
end;
Ответить с цитированием
  #5  
Старый 11.05.2013, 20:16
cyborgg4655 cyborgg4655 вне форума
Начинающий
 
Регистрация: 16.03.2013
Сообщения: 151
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

Блин, не остается эта картинка в кэше((( Даже оперовский кэш проверял так opera:cache и там нету(( Как же его выдернуть то?(( Опера главное его размер определяет легко и скачивает тоже.
Ответить с цитированием
  #6  
Старый 11.05.2013, 21:33
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Ну загрузить в стрим, обнаружить сигнатуру, от нее отплясать и найти информацию о ширине и высоте, все.

З.Ы. Читал тему по диагонали.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #7  
Старый 11.05.2013, 22:05
cyborgg4655 cyborgg4655 вне форума
Начинающий
 
Регистрация: 16.03.2013
Сообщения: 151
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Ну загрузить в стрим, обнаружить сигнатуру, от нее отплясать и найти информацию о ширине и высоте, все.

З.Ы. Читал тему по диагонали.
А по подробней немного? Или ссылочку на источник можно?
Ответить с цитированием
  #8  
Старый 11.05.2013, 22:21
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Ну см. RFC по нужному формату, png или что там.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #9  
Старый 11.05.2013, 23:02
cyborgg4655 cyborgg4655 вне форума
Начинающий
 
Регистрация: 16.03.2013
Сообщения: 151
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Ну см. RFC по нужному формату, png или что там.
Я знаю ширину и высоту, мне нужно зная эти параметры определить размер изображения.
Ответить с цитированием
  #10  
Старый 11.05.2013, 23:06
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Объем штоле? Так бы и писал. Вон там пример со стримом, stream.size взять.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #11  
Старый 11.05.2013, 23:14
cyborgg4655 cyborgg4655 вне форума
Начинающий
 
Регистрация: 16.03.2013
Сообщения: 151
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Объем штоле? Так бы и писал. Вон там пример со стримом, stream.size взять.

Код:
var
  doc: IHTMLDocument2;
  i: Integer;
  img: IHTMLImgElement;
begin
  doc:=WebBrowser1.Document as IHTMLDocument2;
  for i:=0 to doc.all.length-1 do
    if doc.all.item(i, 0).QueryInterface(IID_IHTMLImgElement, img)=S_OK then
    if img.width=121 then
 memo1.Text:=img.fileSize; //Но размер определяется как -1
А как мне по этому аналогу из памяти взять? Чтобы если в памяти есть картинка шириной 121px then memo1.text= ее размер в байтах??
Нашел такой код:
Код:
var
 stream:Tfilestream;
 v:variant;
 begin
 stream:=TfileStream.create('c:1.jpg',fmOpenRead);
 V:=VarArrayCreate([0, stream.size - 1], varByte);
 stream.read(v,stream.size);
 stream.free;
 end;
Но это наверное не совсем то что нужно?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:49.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter