PDA

Ver la Versión Completa : Cargar una imagen desde la web a un TImage


asegura
19-10-2006, 11:07:38
Hola amigos,


Necesito cargar una imagen desde la web (http://www.dominio.com/imagen.jpg) en un TImage. Si lo hago desde el diseño a través de la propiedad Picture no hay problema, en el dialogo pongo la direcció y la carga. El problema esta cuando lo hago desde código, es decir, hago un LoadFromFile('http://www.dominio.com/imagen.jpg'). Esta buscando la dirección c:\programa\http:\www.dominio.com\imagen.jpg.

Si alguien sabe como cargar una imagen, help me plis. :p


;) Muchas gracias

seoane
19-10-2006, 13:59:12
En este hilo (http://www.clubdelphi.com/foros/showpost.php?p=139416&postcount=5) escribí un par de funciones que pueden resultarte útiles. Y si te apetece echale un vistazo al mensaje completo (http://www.clubdelphi.com/foros/showthread.php?t=30918), veras un par de funciones mas que también puedes encontrar interesantes.

asegura
20-10-2006, 01:45:48
Muchas gracias seoane, me ha ido de fabula. Al final lo que he hecho es descargar la imagen como bmp como lo explicas en la primera parte, y luego lo cargo en el TImage normal.

Ahora tengo una segunda duda :p, quiero hacer lo mismo pero con videos y con Flash.


Un saludos y mil gracias,
Asegura

seoane
20-10-2006, 02:13:10
En principio el mismo sistema se puede utilizar para cualquier tipo de archivo. La función DownloadToStream baja el archivo y lo guarda en un stream, así que tenemos 2 opciones, guardarlo en un archivo o si lo vamos a cargar en algún objeto que tenga el método LoadFromStream podemos cargarlo directamente. Por ejemplo:


// Aquí usando la función DownloadToStream guardamos el archivo en disco
var
Stream: TFileStream;
begin
Stream:= TFileStream.Create('d:\1.html',fmCreate);
try
DownloadToStream('http://www.google.es/',Stream);
finally
Stream.Free;
end;
end;


Pero no todo es perfecto, este método bloquea la aplicación mientras se descarga el archivo. Si el archivo es grande y la conexión es lenta la aplicación parecerá congelarse. Una posible solución es utilizar un Application.ProcessMessages dentro del método DownloadToStream, otra solución seria usar los componentes Indy para realizar la descarga.


while (InternetReadFile(hUrl, @Buffer, sizeof(Buffer), BytesRead)) do
begin
if (BytesRead = 0) then
begin
Result := TRUE;
break;
end;
Stream.WriteBuffer(Buffer,BytesRead);
Application.ProcessMessages; // <-- Añadir esto
end;