Estoy buscando cualquier muestra de código que muestre cómo extraer imágenes de la URL al componente Delphi TImage.Cómo obtener imágenes desde la URL en Delphi
Gracias,
Estoy buscando cualquier muestra de código que muestre cómo extraer imágenes de la URL al componente Delphi TImage.Cómo obtener imágenes desde la URL en Delphi
Gracias,
Con la ayuda del componente TMemoryStream e 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;
Código Funcionó para JPEG también.
Agregar "usa JPEG", hice mi ejemplo con la unidad GIF, necesita usar Jpeg uno. –
Más ecológico, no ha utilizado el método correcto de 'Obtener'. Si desea que complete una transmisión, debe recordar pasar la transmisión como un parámetro. La versión de un argumento de 'Get' devuelve el contenido del recurso como una cadena en el valor de retorno de la función. –
Sí Rob, Encontré mi error. Gracias de nuevo a todos por su ayuda. – Greener
Para this project Usé componentes de Indy (como primera respuesta), pero usando el código dentro de un hilo. Útil para descargar imágenes grandes o una gran cantidad de imágenes. Puede ver la explicación completa del proyecto en el enlace (está en español, pero puede usar la traducción automática).
En este caso lo uso para descargar todas las imágenes from this page.
Aquí uso otro componente IdSSL:TIdSSLIOHandlerSocket
, necesario para acceder a una url https; Si debe acceder a http, no lo necesita.
El código de TDownImageThread está (añadido comentarios en inglés):
{: 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;
Para usarlo, la llamada es similar a esto:
// 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;
mejor uso de esta función para descargar:
function DownloadFile(Url, DestFile: string): Boolean;
begin
try
Result := UrlDownloadToFile(nil, PChar(Url), PChar(DestFile), 0, nil) = 0;
except
Result := False;
end;
end;
Incluso podría hacerlo sin TGifImage y hacer img1.Picture.LoadFromStream (MS); –
** Advertencia: ** Si hay una excepción en 'TIdHTTP.Get', este código liberará la variable 'GIF' no inicializada. No use variables en una sección "final" si no las ha inicializado * antes de * ingresar la sección correspondiente "try". –
No, Lars, no puedes hacer eso. 'TPicture.LoadFromStream' está protegido, no es público. Además, simplemente llama a 'Bitmap.LoadFromStream', por lo que no sabrá cómo cargar datos GIF de todos modos. –