Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   JPG-Datei als string speichern (https://www.delphipraxis.net/199120-jpg-datei-als-string-speichern.html)

Markus Effenberger 25. Dez 2018 23:23

JPG-Datei als string speichern
 
Guten Abend liebes Forum,

Ich komme hier irgendwie nicht weiter. Vielleicht weiß jemand Rat?
Eine mobile App auf Android holt sich mittels
BildAlsString := HeaderFooterForm.IdHTTP.Get(URL,Dateistream);
eine JPG-Datei.
Dass die JPG-Datei korrekt übertragen wird, sieht man, wenn man die URL im Browser öffnet.
Daran kanns also nicht liegen.

Dieser Test soll dann als JPG-Datei gespeichert werden

Datei : TextFile;

Assign(Datei,System.IOUtils.TPath.Combine(System.I OUtils.TPath.GetDocumentsPath,Bildname));
Rewrite(Datei);
Writeln(Datei, BildAlsString);
close(Datei);

Später soll die Datei in einem Image geladen werden.

Image1.Bitmap.LoadFromFile(Dateiname);

Das Laden schlägt aber (ohne nähere Gründe in der Exception zu nennen) fehl.

Ich weiß nicht weiter :(

Bin für jeden Tipp dankbar,
Markus

Aviator 25. Dez 2018 23:29

AW: JPG-Datei als string speichern
 
Ich bin zwar kein Android Entwickler, aber ich würde an deiner Stelle die bereits verfügbaren Methoden nutzen statt eine eigene zu bauen. Speichere doch mit Hilfe der Stream.SaveToFile() Methode den heruntergeladenen Stream als Datei ab. Eventuell gehen dir beim Schreiben der Datei mit Writeln() Informationen verloren.

Beim Laden bin ich mir gerade nicht sicher, ob du ohne Umwandlung ein JPG zu einem Bitmap zuweisen kannst bzw. direkt ein JPG Bild reinladen kannst.

Luckie 25. Dez 2018 23:35

AW: JPG-Datei als string speichern
 
Wenn das JPG wirklich als Zeichenkette übertragen wird, dann bestimmt in irgendeiner Form codiert. Base 64 oder so was. Da sonst die nicht darstellbaren Zeichen verloren gehen. Guck dir einfach mal eine JPG Datei mit einem Editor an. Alles was als schwarzer Block oder Rechteck dargestellt wird repräsentiert ein nicht darstellbares Zeichen. Bevor du die Zeichenkette also in einer Datei speicherst, wie auch immer, musst du sie decodieren, sonst hast du nur Müll in der Datei stehen.

p80286 26. Dez 2018 09:55

AW: JPG-Datei als string speichern
 
Zumindest das writeln sorgt für Fehler, weil es ein CRLF(?) hinten anhängt.
Ansonsten, warum nicht einen Filestream oder Blckwrite nutzen?

Gruß
k-H

API 26. Dez 2018 10:09

AW: JPG-Datei als string speichern
 
Kannst du den Dateistream nicht direkt in eine Datei speichern mit .SaveToFile() ?

dummzeuch 26. Dez 2018 11:23

AW: JPG-Datei als string speichern
 
Spätestens seit Delphi Unicode unterstützt, sollte man Strings nicht mehr zum Speichern von binären Daten verwenden. Vermutlich wird bei der Zuweisung so ziemlich alles kaputtkonvertiert. Also folge dem Rat, der hier schon mehrfach stand: Speichere direkt den Stream als Datei ab.

Wenn es unbedingt ein Puffer sein muss, dann wenigstens keinen String nehmen sondern ein Array of Byte oder TBytes.

MyRealName 26. Dez 2018 14:06

AW: JPG-Datei als string speichern
 
Ich hatte es mal so gemacht :

Code:
 
  aStream := TMemoryStream.Create;
  aStream.LoadFromFile('F:\image.png');
  outstream := TStringStream.Create;
  EncodeStream(aStream, outstream);
  Memo2.Lines.Text := outstream.DataString;
  outstream.Free;
  aStream.Free;
Rückwärts geht genauso, nur mit DecodeStream.

p80286 26. Dez 2018 23:07

AW: JPG-Datei als string speichern
 
Aber es geht ja um binäre Daten. Da ist es eigentlich Blödsinn den Umweg über den String zu nehmen, erst recht wenn dann noch umcodiert werden muß(?).
Der String ist ja eine Notlösung aus der Steinzeit der Programmierung, wenn man einen Puffer variabler Größe brauchte.

Gruß
K-H

MyRealName 27. Dez 2018 01:35

AW: JPG-Datei als string speichern
 
So kann man ein Bild (oder binärstream) auch in einer xml datei unterbringen oder per http versenden

brechi 31. Dez 2018 13:21

AW: JPG-Datei als string speichern
 
Ich glaube Idhttp nimmt auch als 2. Parameter einen stream entgegen. Dann sollte das mit einem Tfilestream funktionieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz