Vous pouvez même le faire sans l'TGifImage et ne img1.Image.LoadFromStream(MS); Attention: Si il y a une exception dans TIdHTTP.Get, ce code permettra de libérer de la non initialisée GIF variable. Ne pas utiliser des variables dans un "enfin" si vous n'avez pas initialisé avant entrer le correspondant "d'essayer" de la section. Non, Lars, vous ne pouvez pas le faire. TPicture.LoadFromStream est protégé, pas de public. En outre, il appelle juste Bitmap.LoadFromStream, de sorte qu'il ne sait pas comment faire pour charger GIF données de toute façon. Merci Rob, je l'ai fait en hâte spécialement le Gif, je suis à la recherche de stocker le Flux directement en TImage mais reconnue, il n'est pas disponible. DEUX VOTES NÉGATIFS!!!!!, pourriez-vous expliquer pourquoi vous votez en bas ????
Ajouter "utilise le format JPEG ", j'ai fait mon exemple avec le GIF de l'unité, vous devez utiliser le format Jpeg. Plus écologique, vous n'avez pas utilisé le droit Get méthode. Si vous souhaitez remplir un flux, vous devez vous rappeler de passer le flux en tant que paramètre. L'argument une version de Get renvoie le contenu d'une ressource comme une chaîne de caractères en fonction de la valeur de retour. Oui Rob, j'ai trouvé mon erreur. Merci encore à tout le monde pour obtenir de l'aide. Vous devez éditer votre premier post ou ajouter des commentaires aux réponses pertinentes à la place. Désolé, je ne savais pas. La prochaine fois je serai plus prudent...
Pour ce projet j'ai utilisé Indy composants (comme première réponse), mais en utilisant le code dans un thread. Utile pour télécharger big images ou un grand nombre d'images. Vous pouvez voir l'intégralité de l'explication du projet en lien (il est en espagnol, mais vous pouvez utiliser la traduction automatique).
Ici, j'utilise un autre composant IdSSL:TIdSSLIOHandlerSocket, nécessaire pour l'accès à un https url; Si vous devez accéder à un http, n'en ont pas besoin.
Le code de TDownImageThread est (ajouté des commentaires en anglais):
{: 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)thenbegin
Exit;end;// Path de salida // output path
path := IncludeTrailingBackslash(IncludeTrailingBackslash(PathImage)+
dir)+ ImageName;// Crearlo por si no existe // create it ifnot 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;
Pour l'utiliser, l'appel est similaire à ceci:
// 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
//procedureto return on thread finalize
th.OnTerminate := TerminateThread;
th.Resume;
Mieux utiliser cette Fonction pour le téléchargement:
function DownloadFile(Url, DestFile: string): Boolean;begin
try
Result := UrlDownloadToFile(nil, PChar(Url), PChar(DestFile),0,nil)=0;
except
Result :=False;end;end;
Avec l'aide de TMemoryStream et Indy composant.
Attention: Si il y a une exception dans
TIdHTTP.Get
, ce code permettra de libérer de la non initialiséeGIF
variable. Ne pas utiliser des variables dans un "enfin" si vous n'avez pas initialisé avant entrer le correspondant "d'essayer" de la section.Non, Lars, vous ne pouvez pas le faire.
TPicture.LoadFromStream
est protégé, pas de public. En outre, il appelle justeBitmap.LoadFromStream
, de sorte qu'il ne sait pas comment faire pour charger GIF données de toute façon.Merci Rob, je l'ai fait en hâte spécialement le Gif, je suis à la recherche de stocker le Flux directement en TImage mais reconnue, il n'est pas disponible.
DEUX VOTES NÉGATIFS!!!!!, pourriez-vous expliquer pourquoi vous votez en bas ????
OriginalL'auteur Mohammed Nasman
Code a Travaillé pour le format JPEG.
Plus écologique, vous n'avez pas utilisé le droit
Get
méthode. Si vous souhaitez remplir un flux, vous devez vous rappeler de passer le flux en tant que paramètre. L'argument une version deGet
renvoie le contenu d'une ressource comme une chaîne de caractères en fonction de la valeur de retour.Oui Rob, j'ai trouvé mon erreur. Merci encore à tout le monde pour obtenir de l'aide.
Vous devez éditer votre premier post ou ajouter des commentaires aux réponses pertinentes à la place.
Désolé, je ne savais pas. La prochaine fois je serai plus prudent...
OriginalL'auteur Greener
Pour ce projet j'ai utilisé Indy composants (comme première réponse), mais en utilisant le code dans un thread. Utile pour télécharger big images ou un grand nombre d'images. Vous pouvez voir l'intégralité de l'explication du projet en lien (il est en espagnol, mais vous pouvez utiliser la traduction automatique).
Dans ce cas, je l'utilise pour télécharger toutes les images à partir de cette page.
Ici, j'utilise un autre composant
IdSSL:TIdSSLIOHandlerSocket
, nécessaire pour l'accès à un https url; Si vous devez accéder à un http, n'en ont pas besoin.Le code de TDownImageThread est (ajouté des commentaires en anglais):
Pour l'utiliser, l'appel est similaire à ceci:
OriginalL'auteur Germán Estévez -Neftalí-
Mieux utiliser cette Fonction pour le téléchargement:
OriginalL'auteur Ingo