AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia httpCLI: Download PNG funktioniert nicht, JPG geht

httpCLI: Download PNG funktioniert nicht, JPG geht

Ein Thema von Siggi · begonnen am 6. Apr 2019 · letzter Beitrag vom 9. Apr 2019
 
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, 21: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 21:19 Uhr)
  Mit Zitat antworten Zitat
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz