سؤال

أنا أبحث عن أي نماذج تعليمات برمجية توضح كيفية سحب الصور من عنوان URL إلى مكون Delphi TImage.

شكرًا،

هل كانت مفيدة؟

المحلول

وبمساعدة من عنصر TMemoryStream وإندي.

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;

نصائح أخرى

ورمز عملت لJPEG كذلك.

ل هذا المشروع لقد استخدمت مكونات إندي (مثل الاستجابة الأولى)، ولكن باستخدام الكود الموجود داخل سلسلة رسائل.مفيد لتنزيل الصور الكبيرة أو عدد كبير من الصور.يمكنك الاطلاع على الشرح الكامل للمشروع في الرابط (موجود باللغة الإسبانية ولكن يمكنك استخدام الترجمة الآلية).

في هذه الحالة أستخدمه لتنزيل جميع الصور من هذه الصفحة.
هنا أستخدم مكونًا آخر IdSSL:TIdSSLIOHandlerSocket, ، ضروري للوصول إلى https رابط؛إذا كان يجب عليك الوصول إلى 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;

وأفضل استخدام هذه الوظيفة لتحميل:

function DownloadFile(Url, DestFile: string): Boolean;
begin
   try
     Result := UrlDownloadToFile(nil, PChar(Url), PChar(DestFile), 0, nil) = 0;
   except
     Result := False;
   end;
end;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top