AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bild aus XML auslesen. Wie?

Ein Thema von matashen · begonnen am 31. Mär 2014 · letzter Beitrag vom 5. Nov 2015
Antwort Antwort
Seite 1 von 2  1 2      
matashen

Registriert seit: 29. Jan 2007
Ort: daheim
471 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

Bild aus XML auslesen. Wie?

  Alt 31. Mär 2014, 10:38
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
Matthias
Das Leben ist eines der härtesten.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Bild aus XML auslesen. Wie?

  Alt 31. Mär 2014, 10:46
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
$2B or not $2B

Geändert von himitsu (31. Mär 2014 um 10:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Bild aus XML auslesen. Wie?

  Alt 31. Mär 2014, 11:01
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);
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)

Geändert von baumina (31. Mär 2014 um 11:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Bild aus XML auslesen. Wie?

  Alt 31. Mär 2014, 11:10
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
Frank Reim
  Mit Zitat antworten Zitat
matashen

Registriert seit: 29. Jan 2007
Ort: daheim
471 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: Bild aus XML auslesen. Wie?

  Alt 31. Mär 2014, 13:50
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.

image1.Picture.Graphic.LoadFromStream(jstream);// funkioniert nicht! Warum?
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
Matthias
Das Leben ist eines der härtesten.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Bild aus XML auslesen. Wie?

  Alt 31. Mär 2014, 13:54
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (31. Mär 2014 um 13:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Bild aus XML auslesen. Wie?

  Alt 31. Mär 2014, 14:03
funkioniert nicht! Warum?
Nur bei LoadFromFile wird automatisch das Grafik-Format gewählt, anhand der Dateiendung.

image1.Picture.bitmap.loadfromstream(jstream); auch das funktioniert nicht
Ist das denn ein Bitmap?
Und was heißt "funktioniert nicht"?
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Bild aus XML auslesen. Wie?

  Alt 31. Mär 2014, 14:06
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
matashen

Registriert seit: 29. Jan 2007
Ort: daheim
471 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#9

AW: Bild aus XML auslesen. Wie?

  Alt 31. Mär 2014, 14:28
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
Matthias
Das Leben ist eines der härtesten.
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Bild aus XML auslesen. Wie?

  Alt 31. Mär 2014, 15:03
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
Frank Reim

Geändert von dataspider (31. Mär 2014 um 15:15 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:06 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