Seite 4 von 5

Re: Bild hochladen

Verfasst: 27.03.2018 14:42
von stevie1401
Also so?

Code: Alles auswählen

 bild=CreateImage(#PB_Any,100,100,32,rgb(200,10,30))
 *Buffer = ExportFileMemory(bild)  ;*Buffer ist 0
 size=imagewidth(bild)*imageheight(bild) ;Size ist 10000
 BildString=Base64Encoder(*Buffer, Size)

Size scheint falsch zu sein. Programm hängt sich nach dieser Zeile auf.
Auch weiss ich nicht wie ich dann wieder decodieren kann:

Code: Alles auswählen

 *Bildspeicher = AllocateMemory(Size)   ;Wo bekomme ich Size her, wenn ich die noch nicht kenne?
  bild1=Base64Decode(Bildstring, *Bildspeicher, Size)

EncodeImage kapiere ich natürlich auch nicht

Code: Alles auswählen

keineAhnungwasHierRauskommt=EncodeImage(bild)
Und was kann ich nun mit "keineAhnungwasHierRauskommt" anfangen?



Noch einmal zum Upload.
doko-lounge.de ist eine ganz normale Homapage bei Strato. Was muss denn da alles eingerichtet sein, dass das Upload-Beispiel funktioniert?

Re: Bild hochladen

Verfasst: 27.03.2018 17:29
von ccode_new
Alles Blödsinn und verschwendete Zeit.

Wenn man (wie hier) keinen Zugriff auf den korrekten Bildspeicher hat ist es mit der Base64-Methode einfach nicht möglich.

Wer hier ein Beispiel nach dem Toyota-Motto: "Nichts ist unmöglich." postet -> Respekt!

Ich denke dein Vorhaben ist auf anderer Art zu realisieren.

Hier im Forum gibt es doch einige Web-kundige Leutchen.

Re: Bild hochladen

Verfasst: 27.03.2018 18:11
von mhs
SB ist ja nur eine JavaScript Bibliothek, welche auf dem Client läuft. D.h. er kann dort das Bild laden, Base64 kodieren, fertig. Aber dann dann muss er es irgendwie dem Webserver übermitteln. Dazu benötigt er eine Art Webservice auf seinem Webserver.

@stevie1401: Du hast geschrieben, dass es ein PB Webserver ist. Kannst du an dem Änderungen daran vornehmen? Wenn ja, dann müsstest du den Webserver erweitern, dass er unter einer bestimmten URL die Base64 kodierten Bilddaten annimmt und in eine lokale Datei speichert.

Re: Bild hochladen

Verfasst: 27.03.2018 23:28
von stevie1401
Der BP Web Server ist nicht das Problem. der kann problemlos Base64.

Hier geht es um Spiderbasic und darum, dass ich eben kein Bild lade, sondern eines mittels CreateImage() erstelle und dieses erstellte Bild an den Purebasic Server senden möchte. Dabei ist es mir wirklich vollkommen egal wie, hauptsache es funktioniert irgendwie.

Re: Bild hochladen

Verfasst: 28.03.2018 07:46
von mhs
Die Antwort ist denke ich schon gefallen.

EncodeImage:
URL \$ = EncodeImage ( #Image [, ImagePlugin [, Flags ]])
Returns the URL containing the encoded image, or an empty string if the encoding has failed.
Da steht, dass EncodeImage eine URL liefert. Da SB auf dem Client läuft, kann es sich dabei eigentlich nur um ein Base64 kodierten Data Stream handeln, d.h. eine URL die den Inhalt des Bildes in Base64 kodiert enthält.

So etwas:
data:image/gif;base64,R0lGODdhEAAQAMwAAPj7+FmhUYjNf......
Probier es doch einfach mal aus und schau, welche URL EncodeImage zurückgibt. Falls es so ist, wie ich vermute, musst du dich dann um nichts weiter kümmern und hast dein Bild bereits Base64 kodiert.

Re: Bild hochladen

Verfasst: 28.03.2018 08:30
von stevie1401
Kannst du das bitte einmal als Befehlszeile schreiben? Ich blicke kein Wort von dem was du schreibst.

Re: Bild hochladen

Verfasst: 28.03.2018 08:42
von mhs
URL \$ = EncodeImage ( #Image [, ImagePlugin [, Flags ]])
Diese Funktion sollst du mit deinem Bild ausführen und den Rückgabewert "URL" anschauen.

Ist URL ein Base64 kodierter String?

Re: Bild hochladen

Verfasst: 28.03.2018 08:56
von dige
EncodeImage wandelt dein Bild in einen String, der das Bild Base64 kodiert enthält:

Code: Alles auswählen

CreateImage(0, 8, 8)
Debug EncodeImage(0, #PB_ImagePlugin_PNG)
Ausgabe:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAEUlEQVQYlWNgYGD4TwCPBAUAgkg/wUYFkqkAAAAASUVORK5CYII=

Re: Bild hochladen

Verfasst: 28.03.2018 17:15
von ccode_new
Bild

Aua, wie kann man nur so dämlich sein und diesen Befehl die ganze Zeit gekonnt umgehen.

(Damit meine ich mich selber)

Es kann ja doch so einfach sein.

..............
Gibt es auch einen besseren Weg zum Decodieren ?

Eine CatchImage-Funktion, oder ähnlich gibt es ja nicht.

Oder muss man den Weg über ein File gehen ?

Re: Bild hochladen

Verfasst: 28.03.2018 18:08
von stevie1401
Ich versuche gerade den decodierten String mit dieser Funktion mit Purebasic wieder in ein Image zu verwandeln:

Code: Alles auswählen


Procedure DecodeStringToImage(String.s)
  Protected *Buffer, L, *StringAscii, Image
  
  *Buffer = AllocateMemory(StringByteLength(String)) ;Die Binärdatei ist IMMER kleiner, als der String, egal, wir kümmern uns nicht darum.
  If *Buffer
    CompilerIf #PB_Compiler_Unicode ;Obacht bei Unicode! Base64Decode benötigt den String in Ascii!
      *StringAscii = AllocateMemory(StringByteLength(String, #PB_Ascii))
      If *StringAscii
        PokeS(*StringAscii, String, -1, #PB_Ascii | #PB_String_NoZero)
        L = Base64Decoder(*StringAscii, MemorySize(*StringAscii), *Buffer, MemorySize(*Buffer))
        FreeMemory(*StringAscii)
      EndIf
    CompilerElse
      ;Alles easy, kein Unicode
      L = Base64Decoder(@String, StringByteLength(String), *Buffer, MemorySize(*Buffer))
    CompilerEndIf
    
    If L
      Image = CatchImage(#PB_Any, *Buffer, L)
    EndIf
    FreeMemory(*Buffer)
  EndIf
  
  
  
  
  ProcedureReturn Image
EndProcedure



Funktioniert nur mit Purebasix 5.4x

Man muss sich den Base64-String erst einmal herausnehmen:

Code: Alles auswählen

s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAEUlEQVQYlWNgYGD4TwCPBAUAgkg/wUYFkqkAAAAASUVORK5CYII="

 f=FindString(s,"base64,")  ;s ist der String, der gesendet wurde und in dem das als Base64String umgewandelte Image ist.
  If f>0
    s=Right(s,Len(s)-f-6)  ;String links abschneiden 
  EndIf
  
  
  
  i=DecodeStringToImage(s)
  
  
  ImageGadget(#PB_Any,150,10,ImageWidth(i),ImageHeight(i),ImageID (i))