Как получить изображения с URL в Delphi - PullRequest
14 голосов
/ 04 августа 2009

Я ищу любые примеры кода, которые показывают, как получить изображения из URL в компонент Delphi TImage

Спасибо,

Ответы [ 4 ]

29 голосов
/ 04 августа 2009

С помощью компонента TMemoryStream и Indy.

uses
  GIFImg;

procedure TForm1.btn1Click(Sender: TObject);
var
  MS : TMemoryStream;
  GIf: TGIFImage;
begin
  MS := TMemoryStream.Create;
  GIf := TGIFImage.Create;
  try
    IdHTTP1.get('http://www.google.com/intl/en_ALL/images/logo.gif',MS);
    Ms.Seek(0,soFromBeginning);       
    Gif.LoadFromStream(MS);
    img1.Picture.Assign(GIF);

  finally
    FreeAndNil(GIF);
    FreeAndNil(MS);
  end;
end;
3 голосов
/ 04 августа 2009

Код работал и для JPEG.

0 голосов
/ 01 февраля 2016

Лучше использовать эту функцию для скачивания:

function DownloadFile(Url, DestFile: string): Boolean;
begin
   try
     Result := UrlDownloadToFile(nil, PChar(Url), PChar(DestFile), 0, nil) = 0;
   except
     Result := False;
   end;
end;
0 голосов
/ 29 января 2016

Для этого проекта Я использовал компоненты Indy (например, первый ответ), но использовал код внутри потока. Полезно для загрузки больших изображений или большого количества изображений. Вы можете увидеть полное объяснение проекта в ссылке (на испанском языке, но вы можете использовать автоматический перевод).

В этом случае я использую его для загрузки всех изображений с этой страницы .
Здесь я использую другой компонент IdSSL:TIdSSLIOHandlerSocket, необходимый для доступа к https url; Если вам нужен доступ к http , он вам не нужен.

Код TDownImageThread (добавлены английские комментарии):

  {: Clase para descargar una imagen y almacenarla en disco.}
  {: Class to download image and save to disk}
  TDownImageThread = class(TThread)
  private
    FURLImage: string;
    FPathImage: string;
    FFileNameImage: string;
    // Internas
    ImageName: string;
    PathURL: string;
    // Componente
    idH:TidHTTP;
    IdSSL:TIdSSLIOHandlerSocket;
  public
    // redefinir métodos  // redefine methods
    constructor  Create(AURL:string; AOutPathImages:string);
    destructor Destroy; override;
    procedure Execute; override;
    {: URL de la imagen a descargar. //   URL to download}
    property URLImage:string read FURLImage write FURLImage;
    {: Path de disco local donde voy a almacenar la imagen.}
    {: Local path to save the images}
    property PathImage:string read FPathImage;
    {: Nombre completa (path+Nombre) de la imagen almacenada en disco local}
    {: complete name (path+name) of loval image}
    property FileNameImage:string read FFileNameImage;
  end;



....


{ TDownImageThread }
constructor TDownImageThread.Create(AURL, AOutPathImages: string);
var
  URI:TidURI;
begin

  // crear el thread suspendido  // Create suspended thread
  inherited Create(True);
  // Parámetros: URL y dir de salida   // Params URL and output dir.
  Self.FURLImage := AURL;
  Self.FPathImage := AOutPathImages;
  // Crear con URL    // create with URL 
  URI := TidURI.Create(AURL);
  try
    ImageName := URI.Document;
    PathURL := URI.Path;
  finally
    URI.Free;
  end;
end;

destructor TDownImageThread.Destroy;
begin
  inherited;
end;

//: recupara la imagen y la guarda en disco
procedure TDownImageThread.Execute();
var
  Stream:TFileStream;
  IdH:TidHTTP;
  IdSSL:TIdSSLIOHandlerSocket;
  path:string;
  dir:string;
begin
  // Directorio de salida  // output directory
  dir := AnsiReplaceText(PathURL, '/', STR_EMPTY);
  // Nombre vacío  // empty name
  if (ImageName = STR_EMPTY) then begin
    Exit;
  end;
  // Path de salida     // output path
  path := IncludeTrailingBackslash(IncludeTrailingBackslash(PathImage) +
           dir) + ImageName;
  // Crearlo por si no existe    // create it if not exist
  ForceDirectories(ExtractFilePath(path));
  try
    // Stream para la imagen    // Stream for the image
    Stream  := TFileStream.Create(path, fmCreate);
    try
      // Crear componente para acceder   /// Create the component in runtime
      IdH := TidHttp.Create(nil);
      IdH.ReadTimeout := 30000;
      // necessary to use HTTPS
      IdSSL := TIdSSLIOHandlerSocket.Create(nil);
      IdH.IOHandler := IdSSL;
      IdSSL.SSLOptions.Method := sslvTLSv1;
      IdSSL.SSLOptions.Mode := sslmUnassigned;
      idH.HandleRedirects := True;
      IdH.RedirectMaximum := 3;

      // proteccion
      try
        // Obtener la imagen   // get the image
        IdH.Get(Trim( FURLImage), Stream);
      except
        // Error al descargar la imagen   
        //..  Volcarlo al log
      end;
    finally
      // Liberar    // Free component
      idH.Free;
      // IdSSL.Free;
      Stream.Free;
    end;
    // Path de salida     // output path
    FFileNameImage := path;
  except
    // error al crear el fichero  // error on create file
    //...  Log
  end;
end;

Чтобы использовать его, вызов похож на это:

// Crear un nuevo thread para descargar la imagen
// Create a new thread  LINK+output path
th := TDownImageThread.Create(mmLinks.Lines[i], pathImages);
// Procedimiento de retorno al finalizar
// procedure to return on thread finalize
th.OnTerminate := TerminateThread;
th.Resume;
...