URLからDelphi TImageコンポーネントに画像を取り込む方法を示すサンプルコードを探しています。DelphiでURLから画像を取得する方法
おかげで、TMemoryStreamとインディコンポーネントの助けを借りて
URLからDelphi TImageコンポーネントに画像を取り込む方法を示すサンプルコードを探しています。DelphiでURLから画像を取得する方法
おかげで、TMemoryStreamとインディコンポーネントの助けを借りて
。
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;
コードJPEGでも使用できます。
「JPEGを使用」を追加し、GIFユニットで私の例を作ったので、Jpegを使う必要があります。 –
Greener、あなたは正しい 'Get'メソッドを使用していません。ストリームを満たすには、そのストリームをパラメータとして渡す必要があります。 'Get'の1引数バージョンは、関数の戻り値の文字列としてリソースの内容を返します。 –
はいRob、 私の間違いが見つかりました。 もう一度皆さんに助けてくれてありがとう。 – Greener
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;
ベター・ダウンロードするために、この機能を使用します。
function DownloadFile(Url, DestFile: string): Boolean;
begin
try
Result := UrlDownloadToFile(nil, PChar(Url), PChar(DestFile), 0, nil) = 0;
except
Result := False;
end;
end;
TGifImageを使わなくても、img1.Picture.LoadFromStream(MS)を実行することもできます。 –
**警告:** TIdHTTP.Getに例外がある場合、このコードは初期化されていない 'GIF'変数を解放します。 "finally"セクションで変数を使用しないでください。もし*前に*対応する "try"セクションに入る前に*変数を初期化していなければ。 –
いいえ、ラース、あなたはそれをすることはできません。 'TPicture.LoadFromStream'は保護されており、publicではありません。また、Bitmap.LoadFromStreamを呼び出すだけで、GIFデータをロードする方法はわかりません。 –