Блог по программированию в среде Delphi

Поиск по блогу

Есть идея по созданию интересной программы?

Опиши тут и я по возможности постараюсь это реализовать специально для тебя! Без $ ))

вторник, 27 июля 2010 г.

Функция по загрузке jpg в Timage (Delphi)

Не скажу, что прям моя разработка, но к ней я свою корявую руку приложил))

//непосредственно сама функция по загрузке картинки формата 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
На счет ошибки написал, то что сам видел

3 комментария:

  1. А как определить размер картинки полученный с помощью этой функции?

    ОтветитьУдалить
  2. можно вот так
    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 раза не грузить картинку

    ОтветитьУдалить
  3. >> но к ней я свою корявую руку приложил
    Точно - корявую, я был немного в шоке когда увидел, во первых в функция "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: За функцию всё равно спасибо, если переделать, то жить будет, хотя мне не картинку грузить вовсе :)

    ОтветитьУдалить