Hallo zusammen,
ich nutze schon länger einen einfache Code, der mir ein JPG holt und in eine TJPegImage mit LoadFromStream einfügt.
Jetzt gibt es aber auch PNG-Bilder und das Einfügen in ein TPNGObject geht nicht. Die heruntergeladene Grafik ist definitiv eine PNG. Ich habe das gleiche mal mit
Indy (IdHttp) getestet, da geht es. Ich muss im dieser Applikation aber die httpCLI-Komponente von Overbyte verwenden, daher ist die einfachste Lösung (verwende
Indy) leider nicht möglich
.
Zusammenfassend:
- mit
Indy kann ich JPG und PNG herunterladen und den geladenen MemoryStream mit LoadFromStream in einem TJPEGImage bzw. einem TPNGObject einfügen
.
- mit httpCLI kann ich das nur mit einem JPG, beim selben PNG das mit
Indy funktioniert, wird mir im Code mit httpCLI ein ungültiger Header gemeldet
.
Hier der Code mit httpCLI: (einige unnötige Zeilen (Protokollierung) rausgeworfen, so ist es übersichtlicher.)
Delphi-Quellcode:
Procedure GetPicture(ImageURL:
String;
var image:TJPEGImage);
Var
Data: TMemoryStream;
png: TPNGObject;
tbmp: TBitMap;
SslHttpCli1: TSslHttpCli;
SslContext1: TSslContext;
begin
if (ImageURL>'
')
then
begin
Data := TMemoryStream.Create;
try
SslHttpCli1 := TSslHttpCli.Create(
nil);
SslContext1 := TSslContext.Create(
nil);
SslContext1.SslCipherList := '
ALL:!ADH:RC4+RSA:+SSLv2:@STRENGTH';
SslContext1.SslECDHMethod := sslECDHNone;
SslContext1.SslVerifyPeerModes := [SslVerifyMode_PEER];
SslContext1.SslVersionMethod := sslBestVer;
SslHttpCli1.SslContext := SslContext1;
SslHttpCli1.URL := ImageURL;
SslHttpCli1.RcvdStream := Data;
try
SslHttpCli1.Get;
Data.Position := 0;
//stream-position auf 0 setzen
if TypeToStr(GetImageType(Data)) ='
Image/JPEG'
then
Image.LoadFromStream(Data)
// <--- das funktioniert !!!
else if TypeToStr(GetImageType(Data)) ='
Image/PNG'
then
begin
png := TPNGObject.Create;
tbmp:=TBitMap.Create;
try
png.LoadFromStream(Data);
// <--- das funktioniert nicht, Fehlermeldung wegen ungültigem Header, selbe URL mit idHTTP (Indy) funktioniert.
tbmp.Assign(png);
image.Assign(tbmp);
finally
tbmp.Free;
png.Free;
end;
end
else
showMessage('
unbekannter Grafiktyp');
except
on E:
Exception do
begin
MessageDlg(E.
Message, mtWarning, [mbOK], 0);
end;
end;
finally
Data.Free;
SslHttpCli1.Free;
SslContext1.Free;
end;
end;
end;
Zum Vergleich der Code mit
Indy, da geht's:
Delphi-Quellcode:
Procedure GetPicture(ImageURL:String; var image:TJPEGImage);
var
MS: TMemoryStream;
idHttp1:TIdHttp;
sslIOHandler : TIdSSLIOHandlerSocketOpenSSL;
png: TPNGObject;
tbmp: TBitMap;
begin
// Bild laden
if ImageURL <> '' then
begin
MS := TMemoryStream.Create;
IdHttp1 := TIdHTTP.Create(nil);
if (AnsiUpperCase(copy(ImageURL, 1, 5)) = 'HTTPS') then
begin
sslIOHandler := frmInternetLookup.IdSSLIOHandlerSocketOpenSSL1; //TIdSSLIOHandlerSocketOpenSSL.Create(nil);
sslIOHandler.PassThrough:=true;
sslIOHandler.OnStatusInfo := frmInternetLookup.IdSSLIOHandlerSocketOpenSSL1.OnStatusInfo;
IdHttp1.IOHandler := sslIOHandler;
end;
SetProxyData(IdHttp1);
try
IdHttp1.Get(ImageURL, MS);
MS.Position := 0;
if IdHTTP1.Response.ContentType = 'image/jpeg' then
Image.LoadFromStream(MS) // <--- hier funktioniert sowohl das...
else if IdHTTP1.Response.ContentType = 'image/png' then
begin
png := TPNGObject.Create;
tbmp := TBitmap.Create;
try
png.LoadFromStream(MS); // <--- und das geht hier auch, nur bei httpCLI nicht...
tbmp.Assign(png);
image.Assign(tbmp);
finally
tbmp.Free;
png.Free;
end;
end;
except
// entfernt
end;
MS.Free;
end;
end;
Hat jemand einen Tipp für mich, wo ich ansetzen kann, um die Ursache zu finden?
.. Ergänzung: das Image liegt unter
http://books.google.com/books/conten...source=gbs_api
Danke und Gruß,
Siggi