Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   vCard-Foto in Image (https://www.delphipraxis.net/175959-vcard-foto-image.html)

sintronic86 2. Aug 2013 09:41

vCard-Foto in Image
 
Hallo Community, ich bin es mal wieder.

Ich arbeite gerade mit der TidVCard-Komponente. Im allgemeinen bin ich eher unzufrieden und habe begonnen, den Text der vCard selbst auseinanderzunehmen. Allerdings hänge ich jetzt am Foto.

Wie bekomme ich jetzt den Text des Fotos in ein Image????

Klaus01 2. Aug 2013 09:47

AW: vCard-Foto in Image
 
Hallo,

das englische Wiki sagt, dass der Text base64 codiert ist.

Grüße
Klaus

sintronic86 2. Aug 2013 11:31

AW: vCard-Foto in Image
 
Ok, aber selbst mit den Funktionen, die ich über eine erneute Google-Suche gefunden habe
http://www.qa.downappz.com/questions...-delphi-4.html,
funktioniert es nicht. Wobei sich der Text in diesem Beispiel deutlich von meinem unterscheidet.


Kannst du mir da vielleicht ein wenig auf die Sprünge helfen?

Klaus01 2. Aug 2013 11:41

AW: vCard-Foto in Image
 
nun - ja funktioniert nicht ist nicht sehr hilfreich.

Klar unterscheiden sich der Text aus dem Beispiel von dem Deinen.
Ansonsten wären es ja die gleichen Bilder.

Grüße
Klaus

sintronic86 2. Aug 2013 12:11

AW: vCard-Foto in Image
 
Nein, so war das nicht gemeint. Ich meinte den Aufbau der beiden Texte.

Aber es hat sich scheinbar erledigt. Habe ein passendes Beispiel gefunden, dass ich ein wenig umgebaut habe und das jetzt funktioniert.
Für alle die es interessiert:

Delphi-Quellcode:
procedure decode(AText: String; AImage:TImage);
var TmpInstream : TMemoryStream;
    TmpOutstream: TMemoryStream;
    I          : Integer;
    TmpFile    : Textfile;
    TmpSList   : TStringList;
    TmpFilePath : String;
begin
  TmpInstream  := TMemoryStream.Create;
  TmpOutstream := TMemoryStream.Create;
  TmpSList     := TStringList.Create;

  try

    TmpFilePath := ExtractFilePath(ParamStr(0)) + 'tmp.txt';


    TmpSList.Text := AText;

    AssignFile(TmpFile, TmpFilePath);
    Rewrite(TmpFile);

    for I := 0 to TmpSList.Count - 1 do
    begin
      Writeln(TmpFile, TmpSList[I]);
    end;

    CloseFile(TmpFile);


    TmpInstream.LoadFromFile(TmpFilePath);

    DecodeStream(TmpInstream,TmpOutstream);

    AImage.Bitmap.LoadFromStream(TmpOutstream);
  finally
    TmpOutstream.Free;
    TmpInstream.Free;
    TmpSList.Free;
  end;
end;
Schöner wäre es natürlich, nicht über das Speichern und wieder Laden der Datei zu gehen, aber ich habe es auf Biegen und Brechen nicht hinbekommen....

DeddyH 2. Aug 2013 12:14

AW: vCard-Foto in Image
 
Wie wäre es mit einem TStringStream statt der Stringliste?

Klaus01 2. Aug 2013 12:16

AW: vCard-Foto in Image
 
.. ein paar Kommentare wäre nicht schlecht.
Was mach decodeStream?
Packst Du die ganze vCard in das decodeStream?

Was aus Deinem base64 Text wird kannst Du hier testen -> http://www.opinionatedgeek.com/dotne.../base64decode/

Grüße
Klaus

sintronic86 2. Aug 2013 12:30

AW: vCard-Foto in Image
 
@DeddyH: Danke für den Tipp, das verkürzt den Code wesentlich!

Delphi-Quellcode:
procedure GetImageFromVCardPhoto(AText: String; AImage:TImage);
var TmpInStream : TMemoryStream;
    TmpOutStream: TMemoryStream;
    TmpStrStream: TSTringStream;
begin
  TmpInstream  := TMemoryStream.Create;
  TmpOutstream := TMemoryStream.Create;
  TmpStrStream := TStringStream.Create;

  try
    TmpStrStream.WriteString(AText);
    TmpInstream.LoadFromStream(TmpStrStream);

    DecodeStream(TmpInstream,TmpOutstream);

    AImage.Bitmap.LoadFromStream(TmpOutstream);
  finally
    TmpOutstream.Free;
    TmpInstream.Free;
    TmpStrStream.Free;
  end;
end;

@Klaus01:
Entschuldige bitte, ich hätte es tatsächlich erläutern sollen.
Im Moment lese ich die vCard doch über die TidVCard-Komponente aus und rufe meine procedure dann folgendermaßen auf:

Delphi-Quellcode:
GetImageFromVCardPhoto(TmpidVCard.Photo.EmbeddedData.Text ,Image1);
Das bedeutet, dass es mir mit dieser procedure lediglich um das anzeigen des Fotos aus der vCard geht.
Der Rest der Daten wird an anderer Stelle ausgelesen!

Klaus01 2. Aug 2013 17:26

AW: vCard-Foto in Image
 
Delphi-Quellcode:
uses
  EncdDecd;

var
  stream : TBytesStream;
  base64 : String;
begin
  if idVCard1.Photo.Base64Encoded then
    begin
      base64 := idVCard1.Photo.EmbeddedData.Text;
      stream := TBytesStream.create(decodeBase64(base64));
      try
        if stream.Size > 0 then
          begin
            stream.Seek(0,soBeginning);
            image1.Picture.Bitmap.LoadFromStream(stream);
          end;
      finally
        stream.Free;
      end;
    end;
end;
Dann müsste sich irgendwie noch ermitteln lassen, ob es sich um ein Bitmap, gig oder jpg Photo handelt.

Da ich keine vCard zur Hand hatte - habe ich den Code nicht getestet.

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 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