2009-08-04 56 views

答えて

28

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; 
+0

TGifImageを使わなくても、img1.Picture.LoadFromStream(MS)を実行することもできます。 –

+1

**警告:** TIdHTTP.Getに例外がある場合、このコードは初期化されていない 'GIF'変数を解放します。 "finally"セクションで変数を使用しないでください。もし*前に*対応する "try"セクションに入る前に*変数を初期化していなければ。 –

+1

いいえ、ラース、あなたはそれをすることはできません。 'TPicture.LoadFromStream'は保護されており、publicではありません。また、Bitmap.LoadFromStreamを呼び出すだけで、GIFデータをロードする方法はわかりません。 –

3

コードJPEGでも使用できます。

+0

「JPEGを使用」を追加し、GIFユニットで私の例を作ったので、Jpegを使う必要があります。 –

+0

Greener、あなたは正しい 'Get'メソッドを使用していません。ストリームを満たすには、そのストリームをパラメータとして渡す必要があります。 'Get'の1引数バージョンは、関数の戻り値の文字列としてリソースの内容を返します。 –

+0

はいRob、 私の間違いが見つかりました。 もう一度皆さんに助けてくれてありがとう。 – Greener

0

this project私はIndyコンポーネント(最初の応答のような)を使用しましたが、スレッド内のコードを使用しました。大きな画像や多数の画像をダウンロードするのに便利です。あなたはプロジェクトの完全な説明をリンクで見ることができます(スペイン語ですが、自動翻訳を使用できます)。

この場合、私はすべての画像from this pageをダウンロードするために使用します。
ここでは、別のコンポーネントIdSSL:TIdSSLIOHandlerSocketを使用して、https urlへのアクセスに必要です。 httpにアクセスする必要がある場合は、その必要はありません。

TDownImageThreadのコードは(英語のコメントを追加しました)されています

{: 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; 

それを使用するには、呼び出しは次のようになります。

// 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; 
0

ベター・ダウンロードするために、この機能を使用します。

function DownloadFile(Url, DestFile: string): Boolean; 
begin 
    try 
    Result := UrlDownloadToFile(nil, PChar(Url), PChar(DestFile), 0, nil) = 0; 
    except 
    Result := False; 
    end; 
end; 
関連する問題