Mehrere Fragen zu SE VCards ...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Mehrere Fragen zu SE VCards ...

Beitrag 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!
walker
Beiträge: 278
Registriert: 29.08.2004 18:39
Wohnort: Bayern

Re: Mehrere Fragen zu SE VCards ...

Beitrag 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...)
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag von Ghosty1967 »

Bin anscheinend etwas überfordert oder sehe den Wald vor lauter Bäumen nicht!
Wie genau schreibe ich die Daten denn auf Pladde? :?
walker
Beiträge: 278
Registriert: 29.08.2004 18:39
Wohnort: Bayern

Beitrag 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")
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag 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:
walker
Beiträge: 278
Registriert: 29.08.2004 18:39
Wohnort: Bayern

Beitrag 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)
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag von Ghosty1967 »

Yep, so hab ichs gemacht... :mrgreen:
(natürlich hatte ich im ersten Anlauf UseJPEGImageDecoder() vergessen)
walker
Beiträge: 278
Registriert: 29.08.2004 18:39
Wohnort: Bayern

Beitrag von walker »

:lol:
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag 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? :?
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag von Ghosty1967 »

Habs schon gelöst... :lol:
Antworten