Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Bild aus XML auslesen. Wie? (https://www.delphipraxis.net/179767-bild-aus-xml-auslesen-wie.html)

matashen 31. Mär 2014 09:38

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

himitsu 31. Mär 2014 09:46

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

baumina 31. Mär 2014 10:01

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);

dataspider 31. Mär 2014 10:10

AW: Bild aus XML auslesen. Wie?
 
Ich hatte das mal mit Indy gemacht für PDF - Dateien:

Delphi-Quellcode:
...
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;
Frank

matashen 31. Mär 2014 12:50

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:
      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
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.

Delphi-Quellcode:
image1.Picture.Graphic.LoadFromStream(jstream);//
funkioniert nicht! Warum?
Delphi-Quellcode:
image1.Picture.bitmap.loadfromstream(jstream);
auch das funktioniert nicht

Irgendwie fehlt mir noch das Puzzle um das Bild in ein TImage zu bekommen.

Gruß Matthias

Neutral General 31. Mär 2014 12:54

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.

himitsu 31. Mär 2014 13:03

AW: Bild aus XML auslesen. Wie?
 
Zitat:

Zitat von matashen (Beitrag 1254169)
funkioniert nicht! Warum?

Nur bei LoadFromFile wird automatisch das Grafik-Format gewählt, anhand der Dateiendung.

Zitat:

Zitat von matashen (Beitrag 1254169)
image1.Picture.bitmap.loadfromstream(jstream); auch das funktioniert nicht

Ist das denn ein Bitmap?
Und was heißt "funktioniert nicht"?

Neutral General 31. Mär 2014 13:06

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.

matashen 31. Mär 2014 13:28

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:
Jpeg := TJPEGImage.Create;
Jpeg.LoadFromStream(binstream);
image1.Picture.bitmap.Assign(jpeg);
geht auch nicht. Bekomm ich einen JPEG-Fehler#42

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

dataspider 31. Mär 2014 14:03

AW: Bild aus XML auslesen. Wie?
 
IMHO erkennt TWICImage bei LoadFromStream das Format.
Delphi-Quellcode:
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;
Bab es grad mal mit PNG ausprobiert:

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 21:14 Uhr.
Seite 1 von 2  1 2      

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