Einzelnen Beitrag anzeigen

Siggi

Registriert seit: 19. Jun 2004
Ort: Lollar
52 Beiträge
 
Delphi 11 Alexandria
 
#1

httpCLI: Download PNG funktioniert nicht, JPG geht

  Alt 6. Apr 2019, 22:12
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/JPEGthen
          Image.LoadFromStream(Data) // <--- das funktioniert !!!
        else if TypeToStr(GetImageType(Data)) ='Image/PNGthen
        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/jpegthen
        Image.LoadFromStream(MS) // <--- hier funktioniert sowohl das...
      else if IdHTTP1.Response.ContentType = 'image/pngthen
      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

Geändert von Siggi ( 6. Apr 2019 um 22:19 Uhr)
  Mit Zitat antworten Zitat