Je cherche des exemples de code qui montrent comment extraire des images de l'URL dans le composant Delphi TImage. Avec l'aide du composant TMemoryStream et IndyComment obtenir des images de l'URL dans Delphi
Merci,
Je cherche des exemples de code qui montrent comment extraire des images de l'URL dans le composant Delphi TImage. Avec l'aide du composant TMemoryStream et IndyComment obtenir des images de l'URL dans Delphi
Merci,
.
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;
Code A également travaillé pour le format JPEG.
Ajouter "utilise JPEG", j'ai fait mon exemple avec l'unité GIF, vous devez utiliser un Jpeg. –
Plus vert, vous n'avez pas utilisé la bonne méthode 'Get'. Si vous voulez qu'il remplisse un flux, vous devez vous souvenir de passer le flux en tant que paramètre. La version à un argument de 'Get' renvoie le contenu de la ressource sous la forme d'une chaîne dans la valeur de retour de la fonction. –
Oui Rob, J'ai trouvé mon erreur. Merci encore à tous pour votre aide. – Greener
Pour this project J'ai utilisé des composants Indy (comme la première réponse), mais en utilisant le code dans un thread. Utile pour télécharger de grandes images ou un grand nombre d'images. Vous pouvez voir l'explication complète du projet dans le lien (est en espagnol mais vous pouvez utiliser la traduction automatique).
Dans ce cas je l'utilise pour télécharger toutes les images from this page.
Ici, j'utilise un autre composant IdSSL:TIdSSLIOHandlerSocket
, nécessaire pour accéder à un https url; Si vous devez accéder à un http, n'en avez pas besoin.
Le code de TDownImageThread est (a ajouté des commentaires 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) 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;
Pour l'utiliser, l'appel est semblable à 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
// procedure to return on thread finalize
th.OnTerminate := TerminateThread;
th.Resume;
Une meilleure utilisation de 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;
Vous pourriez même faire sans le TGifImage et faire img1.Picture.LoadFromStream (MS); –
** Attention: ** S'il y a une exception dans 'TIdHTTP.Get', alors ce code libérera la variable' GIF' non initialisée. N'utilisez pas de variables dans une section "finally" si vous ne les avez pas initialisées * avant * d'entrer dans la section "try" correspondante. –
Non, Lars, tu ne peux pas faire ça. 'TPicture.LoadFromStream' est protégé, pas public. En outre, il appelle simplement Bitmap.LoadFromStream, il ne saura donc pas comment charger les données GIF. –