_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 08 Jul, 2003 5:32 am Asunto: |
|
|
Hola:
A ver si te vale esta función. Es independiente del TCppWebBrowser.
Un ejemplo de su uso:
DescargarImagenJpeg("cppbuilder.hypermart.net", "/jl.jpg", Image1);
- Añadimos un TImage (Image1) y un TButton (Button1) e incluimos las siguientes cabeceras:
| Código: | #include <memory>
#include <ScktComp.hpp>
#include <jpeg.hpp>
|
- La siguiente función:
| Código: | bool DescargarImagenJpeg(const String& servidor, const String& archivo,
TImage* image)
{
std::auto_ptr<TClientSocket> socket(new TClientSocket(0));
socket->Host = servidor;
socket->ClientType = ctBlocking;
socket->Port = 80;
socket->Open();
if (socket->Active)
{
socket->Socket->SendText("GET " + archivo
+ " HTTP/1.1\r\nHost: " + servidor + "\r\n\r\n");
int ret = 1;
std::auto_ptr<TStringStream> stream(new TStringStream(""));
while (socket->Active && ret > 0)
{
Application->ProcessMessages();
char szBuffer[1024];
// En el primer paquete que recibimos tenemos información
// sobre el tamaño en bytes de la imagen, entre otros
// datos con lo que podriamos poner una barra de progreso...
ret = socket->Socket->ReceiveBuf(szBuffer, sizeof(szBuffer));
stream->Write(szBuffer, ret);
}
// Buscamos donde acaba la cabecera que envia el servidor
stream->Position = stream->DataString.Pos("\r\n\r\n") + 3;
// Comprobamos que a continuacion hay una imagen .jpg
if (stream->DataString.SubString(stream->Position+1, 2) == "\xFF\xD8")
{
std::auto_ptr<TJPEGImage> jpeg(new TJPEGImage);
jpeg->LoadFromStream(stream.get());
image->Picture->Assign(jpeg.get());
return true;
}
}
return false;
} |
La ventaja de hacerlo así es que no se descarga la imagen a disco, todo se hace en memoria, aunque si quieres una forma más sencilla descargando la imagen a disco fíjate en la función del API "URLDownloadToFile".
Saludos:
_Leo |
|