Seite 1 von 2

Mehrere Fragen zu SE VCards ...

Verfasst: 17.06.2009 08:31
von Ghosty1967
Hallöle...

Ich beschäftige mich gerade mit den VCards meines Sony-Ericsson Handys.
Im Moment interessieren mich besonders folgende Themen.
Die "einfachen" Daten sind im UTF-8 Format im Handy abgelegt. Lese ich
also eine VCard ein, so bekomme ich natürlich statt der Umlaute z.B. =C3=A4
für das "ä" angezeigt usw. Bis jetzt wandele ich den String zur
Anzeige im Programm einfach mittels mehrerer "ReplaceString" um. Kennt
da jemand einen eleganteren Weg?
Viel wichtiger wäre mir allerdings ein Tipp zu folgendem:
Es werden auch Bilddaten innerhalb der VCard abgelegt.
Die Zeile in der VCard sieht dann so aus:
PHOTO;ENCODING=BASE64;TYPE=JPEG:/9j/4AAQSk... usw. (insgesamt 5588 Zeichen)
Wie kann ich denn diese Daten wieder in ein Bild verwandeln um es in
einem ImageGadget anzuzeigen? :?

Wäre für nen Schnippsel dankbar!

Re: Mehrere Fragen zu SE VCards ...

Verfasst: 17.06.2009 11:03
von walker
Ghosty1967 hat geschrieben:Hallöle...

Es werden auch Bilddaten innerhalb der VCard abgelegt.
Die Zeile in der VCard sieht dann so aus:
PHOTO;ENCODING=BASE64;TYPE=JPEG:/9j/4AAQSk... usw. (insgesamt 5588 Zeichen)
Wie kann ich denn diese Daten wieder in ein Bild verwandeln um es in
einem ImageGadget anzuzeigen? :?

Wäre für nen Schnippsel dankbar!
Wie wäre es mit Base64Decode()? und dann als jpg abspeichern... :allright:
(ist im Prinzip wie bei einer Mail mit Anhang)

Code: Alles auswählen

Procedure.s base64decode(strText.s, encoding = #PB_Ascii);
    Define.s Result
    If strText.s = ""
        ProcedureReturn strText.s
    EndIf
    *B64DecodeBufferA = AllocateMemory(Len(strText)*2)
    *B64DecodeBufferB = AllocateMemory(Len(strText)*2)
    PokeS(*B64DecodeBufferA, strText)
    Base64Decoder(*B64DecodeBufferA, Len(strText), *B64DecodeBufferB, Len(strText))
    Result = PeekS(*B64DecodeBufferB, -1, encoding)
    FreeMemory(*B64DecodeBufferA)
    FreeMemory(*B64DecodeBufferB)
    ProcedureReturn Result
EndProcedure
/EDIT:

In Deinem Fall musst Du einfach anstatt des Strings die Daten im Speicher mit Writedata() auf die Platte schreiben ... (ich verwende die Proc so in einem meiner Programme...)

Verfasst: 17.06.2009 20:21
von Ghosty1967
Bin anscheinend etwas überfordert oder sehe den Wald vor lauter Bäumen nicht!
Wie genau schreibe ich die Daten denn auf Pladde? :?

Verfasst: 18.06.2009 00:46
von walker
habe die Prozedur mal so geändert, das Du sie 1:1 übernehmen kannst.
Du musst jetzt nur noch die jpg-Daten (da sie BASE64 codiert sind) als String übergeben, einen Dateinamen (incl. Pfad) angeben und fertig 8)

Code: Alles auswählen

Procedure Get_JPG(strText.s, filename.s);
    Protected *B64DecodeBufferA, *B64DecodeBufferB
    Protected len_jpg
    Protected file
    
    If strText.s = "" Or filename = ""
        ProcedureReturn #False
    EndIf
    
    *B64DecodeBufferA = AllocateMemory(Len(strText)*2)
    *B64DecodeBufferB = AllocateMemory(Len(strText)*2)
    PokeS(*B64DecodeBufferA, strText)
    len_jpg = Base64Decoder(*B64DecodeBufferA, Len(strText), *B64DecodeBufferB, Len(strText)*2)
    file    = CreateFile(#PB_Any, filename)
    WriteData(file, *B64DecodeBufferB, len_jpg)
    CloseFile(file)
    FreeMemory(*B64DecodeBufferA)
    FreeMemory(*B64DecodeBufferB)
    ProcedureReturn #True

EndProcedure

;beispiel
Get_JPG(your_jpg_data.s, GetTemporaryDirectory() + "test.jpg")

Verfasst: 18.06.2009 09:37
von Ghosty1967
Danke walker...

Klappt prima, eigentlich ziemlich simbel, aber manchmal sieht man halt den Wald vor lauter Bäumen nicht.
Hat mir sehr geholfen :allright:

Verfasst: 18.06.2009 14:38
von walker
freut mich, das ich helfen konnte :D

wenn Du im Übrigen das Bild NUR anzeigen willst, kannst du anstatt es auf Platte zu schreiben, einfach mit CatchImage() ein Image daraus erstellen (UseJPEGImageDecoder() nicht vergessen!) und entsprechend anzeigen...8)

Verfasst: 18.06.2009 15:49
von Ghosty1967
Yep, so hab ichs gemacht... :mrgreen:
(natürlich hatte ich im ersten Anlauf UseJPEGImageDecoder() vergessen)

Verfasst: 18.06.2009 18:16
von walker
:lol:

Verfasst: 24.06.2009 06:53
von Ghosty1967
Wie kann ich denn den umgekehrten Weg gehen - also eine mit einem Grafikprogramm erstellte JPEG-Datei laden und im VCard-Format innerhalb der VCard wieder ablegen.
Eigentlich muß ich doch "nur" die Speicheradresse der JPEG-Datei kennen und dann den "Base64Encoder" darauf anwenden - oder?
Aber wie bekomme ich denn die Speicheradresse des Bildes, wenn ich es mittels "LoadImage" lade? :?

Verfasst: 24.06.2009 07:41
von Ghosty1967
Habs schon gelöst... :lol: