![]() |
Bild aus XML auslesen. Wie?
Hallo zusammen,
ich rattere jetzt schon einiges an einem Problem das ich mit Bildern habe die in einem XML abgelegt sind. Vorweg: Das XML file ist nicht von mir, sondern wird von einer fremdsoftware ausgespuckt, wo ich leider zu der datei keine Doku erhalte. In dem XML sind Bilder enthalten die ich weiterverwenden muss. Was ich jetzt bei allem ergegoogelten gefunden habe basiert darauf das es mit Base64 und Streams gewandelt werden muss, also der textstring im XML zu Stream. Nur Beispielcode hab ich keinen gefunden. Und ich hab keine Ahnung was mit Base64 gemeint ist. Das steht auch in jedem gefundenen Beitrag in der DP, nur mit verweisen auf ältere Beiträge die aber auch keinen Beispielcode oder Tut oder sowas enthalten und ich damit dann wieder bei null bin. Der Textstring im XML sieht z.B. so aus /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHB wgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAA Kann mir da jemand weiterhelfen? Bitte wenns geht mit Codebeispiel und keinen Link zu was theorethischem. Da hab ich mich schon zu tode gegoogelt. Ich hab einfach keinen Plan wie ich das gewandelt bekomme. Vieleicht noch wichtig: Ich hab XE2 mit den Jedi die dabei waren. Da ist auch was von IDEncoderMime. Da müsste doch auch tun? aber wie wende ich das an? Gruß Matthias |
AW: Bild aus XML auslesen. Wie?
Zum Thema Base64 sollte sich hier aber so einige Beispielcodes finden lassen?
Und wenn du XE2 in mindestens der professional nutzt, dann kannst du einfach alle Funktionen/Klassen suchen, welche "Base64" im Namen haben. Ich vergess das auch immer wieder [s], aber in den Indy versteckt sich mindestens eine Unit mit Funktionen dafür[s]. [edit] hast'e ja schon genannt, im XE gibt es die IdEncoderMime nicht, aber wenn du die schon kennst, warum schaust du dann nicht nach, was für Funktionen davon für dich nutzbar sind? Strg+Shift+F, in Verzeichnissen suchen, Filter=*.pas, Verzeichnis=C:\Program Files (x86)\Embarcadero\RAD Studio\9.0 [edit] und Delphi hat seine Unit EncdDecd Eventell hast du jetzt auch nicht direkt String => Stream, sondern mußt es eben mit einem Umweg machen? String => Buffer (z.B. ein Byte-Array) => Stream => rausfinden was für ein Format das Bild hat (BMP, PNG, JPEG usw.), was man vermutlich über die ersten Bytes (Header) machen könnte => Eine Instanz der passenden Grafikklasse erstellen und da LoadFromStream |
AW: Bild aus XML auslesen. Wie?
Schau mal in die Unit {Soap.}EncdDecd.pas, da müsste alles drin sein, was du brauchst.
Delphi-Quellcode:
JStream := TBytesStream.Create(DecodeBase64(AString));
Jpeg := TJPEGImage.Create; Jpeg.LoadFromStream(JStream); |
AW: Bild aus XML auslesen. Wie?
Ich hatte das mal mit Indy gemacht für PDF - Dateien:
Delphi-Quellcode:
Frank
...
procedure Base64DecodeToStream(const AText: string; AStream: TMemoryStream); ... procedure Base64DecodeToStream(const AText: string; AStream: TMemoryStream); var DecodedStream: TBytesStream; Decoder: TIdDecoderMIME; begin Decoder := TIdDecoderMIME.Create(nil); try DecodedStream := TBytesStream.Create; try Decoder.DecodeBegin(DecodedStream); Decoder.Decode(AText); Decoder.DecodeEnd; DecodedStream.SaveToStream(AStream); finally DecodedStream.Free; end; finally Decoder.Free; end; end; |
AW: Bild aus XML auslesen. Wie?
Hallo,
erstmal danke für die konkreten Codeschnipsel und brauchbaren Antworten. Also ich hab die Enterprise, da ist alles drin - auch im Indy-Paket die IDDecoderMIME. Ich hatte es schon fast richtig. Was mich wurmt, bei den Jedis ist keine gute Hilfe mit dabei (F1). Der Code von frank passt super. Ganz klappts aber noch nicht Ich hab in mal integriert und alles raus was ich ohne procedure nicht brauch und schon anderswo created und free ist
Delphi-Quellcode:
letzte Zeile hab ich rein um zu testen welches Bildformat zugrunde liegt, aber irgendwie checkt das Delphi selber und ich kann in jedem bliebigem Format speichern.
IDDecoderMIME1.DecodeBegin(jStream);//JStream:TBytesstream;
IDDecoderMIME1.Decode(a);//a:string; IDDecoderMIME1.DecodeEnd; jStream.SaveToStream(binstream);//binstream:Tmemorystream; jstream.SaveToFile('U:\TEST1.png');//funktioniert auch als .bmp .jpg
Delphi-Quellcode:
funkioniert nicht! Warum?
image1.Picture.Graphic.LoadFromStream(jstream);//
Delphi-Quellcode:
auch das funktioniert nicht
image1.Picture.bitmap.loadfromstream(jstream);
Irgendwie fehlt mir noch das Puzzle um das Bild in ein TImage zu bekommen. Gruß Matthias |
AW: Bild aus XML auslesen. Wie?
Versuch einfach mal nur Image1.Picture.LoadFromFile
Musst dann ggf. "jpeg" bzw. "PNGImage" einbinden Edit: Hat Image1.Picture nicht auch ein LoadFromStream? Dann müsstest du das Bild auch direkt aus dem dekodierten Stream laden können. |
AW: Bild aus XML auslesen. Wie?
Zitat:
Zitat:
Und was heißt "funktioniert nicht"? |
AW: Bild aus XML auslesen. Wie?
Wenn du weißt welches Bildformat vorliegt würde ich dir folgendes vorschlagen:
TPNGImage/TJPEGImage/TBitmap erzeugen, LoadFromStream aus deinem dekodierten Stream und dann das PNG/JPEG/Bitmap-Objekt der Image1.Picture.Graphic zuweisen. |
AW: Bild aus XML auslesen. Wie?
ich will ja nicht loadfromfile, sondern loadfromstream, und das gibts bei Picture nicht sondern nur im graphic-Adapter
Inziwschen bin ich der festen Überzeugung das es sich um JPEG handelt die hier ins XML eingebunden wurden. Zumindest wenn ich den Stream Speichere und wieder lade dann ist jpg die einzige Dateiversion wo delphi nicht meckert das der Header fehlerhaft ist. der Windows-Explorer zeigt aber alles tadellos an. Evtl wertet der den Header an sich aus und nicht anhand der Dateiendung... egal. Problem ist noch das ich das Bild nicht direkt vom Stream in mein Image bekomme
Delphi-Quellcode:
geht auch nicht. Bekomm ich einen JPEG-Fehler#42
Jpeg := TJPEGImage.Create;
Jpeg.LoadFromStream(binstream); image1.Picture.bitmap.Assign(jpeg); Das einzige was geht ist als temporäre Datei abspeichern und wieder laden mit image1.picture.loadfromfile() - aber das ist ja totaler blödsinn wenn ich das schon im stream habe... anererseits ists mir langsam schnuppe hauptsache das Ding läuft. Nachdem ich nicht weis wies die Software ablegt bin ich froh das überhaupt wieder als Bild zu bekommen. Evtl komm ich ja im laufe der Zeit noch dahinter. Gruß Matthias |
AW: Bild aus XML auslesen. Wie?
IMHO erkennt TWICImage bei LoadFromStream das Format.
Delphi-Quellcode:
Bab es grad mal mit PNG ausprobiert:
procedure Test;
var AImage: TWICImage; ABitMap: TBitmap; begin AImage := TWICImage.Create; ABitMap := TBitmap.Create; try AImage.LoadFromStream(AStream); // Weiter entsprechend AImage.ImageFormat // oder in eine Bitmap... ABitMap.Assign(AImage); finally ABitMap.Free; AImage.Free; end; end;
Delphi-Quellcode:
procedure TForm11.Button1Click(Sender: TObject);
Var AStream: TMemoryStream; begin AStream := TMemoryStream.Create; try AStream.LoadFromFile('r:\warning.png'); ShowImageFromStream(AStream); finally AStream.Free; end; end; procedure TForm11.ShowImageFromStream(AStream: TStream); Var AImage: TWICImage; begin AImage := TWICImage.Create; try AImage.LoadFromStream(AStream); Image1.Picture.Assign(AImage); finally AImage.Free; end; end; Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:47 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 by Thomas Breitkreuz