//непосредственно сама функция по загрузке картинки формата jpg из сети интернет
//для работы функции необходимо добавить в uses ... wininet, Jpeg;
function GetImage(url:string): TPicture;
var
hInternet, hConnect: pointer;
dwBytesRead, i, L: cardinal;
sTemp,aUrl: AnsiString; // текст страницы
memStream: TMemoryStream;
jpegimg: TJPEGImage;
begin
hInternet := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
try
if Assigned(hInternet) then
begin
hConnect := InternetOpenUrl(hInternet, PChar(url), nil, 0, 0, 0);
if Assigned(hConnect) then
try
i := 1;
repeat
SetLength(sTemp, L + i);
if not InternetReadFile(hConnect, @sTemp[i], sizeof(L),dwBytesRead) then
break; // Получаем данные с сервера
inc(i, dwBytesRead);
until dwBytesRead = 0;
finally
InternetCloseHandle(hConnect);
end;
end;
finally
InternetCloseHandle(hInternet);
end;
memStream := TMemoryStream.Create;
jpegimg := TJPEGImage.Create;
try
memStream.Write(sTemp[1], Length(sTemp));
memStream.Position := 0;
//загрузка изображения из потока
jpegimg.LoadFromStream(memStream);
Result:=TPicture.Create;
Result.Assign(jpegimg);
finally
//очистка
memStream.Free;
jpegimg.Free;
end;
end;
Пример использования функции
Специально для этих целей загружу на блог картинку в jpg просто может вы будете загружать картинку в другом формате и это приведет к исключительной ситуации, что мало приятно.
вот она
Листинг примера использования функции
procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Picture:=GetImage('https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8bP5aXjsBZpYEeFCkpT2l4JXa7yGAAVyAPbn4hzMBuzuTdD0WUEDQYb3YnJDrl_deh8YetAE7ZA5CjqwZAWqKtKLRA_jjg0lrPB1aViMmRgqFOj606Qwy5A-jeX7UhiDIRRIYxrVEATvN/s320/images.jpg');
end;
Ошибка 53 jpeg error 53
возникате по причине того, что не возможно определить тип файла который загружается в jpegimg
если вместо
memStream.Write(sTemp[1], Length(sTemp));
написать
memStream.Write(sTemp[0], Length(sTemp));
возникнет ошибка 53
На счет ошибки написал, то что сам видел
А как определить размер картинки полученный с помощью этой функции?
ОтветитьУдалитьможно вот так
ОтветитьУдалитьMemo1.Lines.Add(IntToStr(GetImage('http://www.astronomy2009.org/static/resources/iya_logo_final_b&w.jpg').Width));
Memo1.Lines.Add(IntToStr(GetImage('http://www.astronomy2009.org/static/resources/iya_logo_final_b&w.jpg').Height));
или загрузить в TImage и получить оттуда данные чтобы 2 раза не грузить картинку
>> но к ней я свою корявую руку приложил
ОтветитьУдалитьТочно - корявую, я был немного в шоке когда увидел, во первых в функция "SetLength(sTemp, L + i)" создаст нереальную утечку памяти после выполнения, во вторых зачем делать Buffer Allocate для Pointer затем лить из Pointer в TMemoryStream O_o Когда можно было-бы создать намного меньший буффер и лить напрямую в TMemoryStream, а вообще если судить совсем строго, то TMemoryStream вообще можно было не использовать а отправить данные напрямую в TPicture например вот так Object_TPicture.Assign(ImagePointer^);
А ещё интересный вопрос, если картинку удалили с сайта или у клиента выключили net то функцию проверять в Try/Catch? или пускай программа грохается на Assign Memory?
(c) TuXAPuK Форум Чертёнка.Ру
ps: За функцию всё равно спасибо, если переделать, то жить будет, хотя мне не картинку грузить вовсе :)