Seite 3 von 5

Re: Bild hochladen

Verfasst: 23.03.2018 17:29
von RSBasic
Wenn SpiderBasic in der Lage ist, serverseitig den empfangenen String in eine Datei abzuspeichern, dann wäre das möglich.
Wenn nicht, dann musst du auch für Base64 eine php-Datei, die deinen Base64-String in eine Datei abspeichert.

Re: Bild hochladen

Verfasst: 23.03.2018 19:05
von stevie1401
Ich habe als Webserver den Server von dige, also einen Purebasic Server. Purebasic kann ja Base64.
Die Frage ist jetzt, wie wandle ich mit Spider ein Image in einen Base64-String um?

Re: Bild hochladen

Verfasst: 23.03.2018 19:29
von ccode_new
Hallo stevie1401,

den Base64-Decoder/Encoder gibt es leider "noch" nicht per Standard bei Spiderbasic.

Aber schaue mal hier:

Base64-Spiderbasic

Anbei: Upps, da wurde ja schon ein Beispiel im Thread gepostet.

Re: Bild hochladen

Verfasst: 23.03.2018 19:40
von mhs
stevie1401 hat geschrieben:Ich habe als Webserver den Server von dige, also einen Purebasic Server. ...
Womit auch klar sein sollte, dass der Webserver kein PHP kann.

Re: Bild hochladen

Verfasst: 24.03.2018 09:11
von stevie1401
ccode_new hat geschrieben:Hallo stevie1401,

den Base64-Decoder/Encoder gibt es leider "noch" nicht per Standard bei Spiderbasic.

Aber schaue mal hier:

Base64-Spiderbasic

Anbei: Upps, da wurde ja schon ein Beispiel im Thread gepostet.
Leider wird dort nicht beschrieben wie ich die Proceduren anwenden kann, um Images in Strings umwandeln kann.
Kann mir jemand ein einfaches Beispiel geben?

Code: Alles auswählen

 bild=CreateImage(#PB_Any,100,100,32,rgb(200,10,30))
Wie mache ich jetzt aus "bild" einen String?

Re: Bild hochladen

Verfasst: 24.03.2018 10:08
von ccode_new
Hier die Antwort:

Code: Alles auswählen

Global base64$="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="

Procedure.l Base64Decoder(*in,insize,*out,outsize)
  actual=0   
  If insize%4=0
    For loop=0 To insize Step 4
      c0=(FindString(base64$,PeekS(*in,loop,1,#PB_Ascii))-1)&$3f
      c1=(FindString(base64$,PeekS(*in,loop+1,1,#PB_Ascii))-1)&$3f
      PokeB(*out,actual,((c0<<2)|(c1>>4))&$ff)
      actual+1
      If actual>=outsize
        Break
      EndIf
      c2=(FindString(base64$,PeekS(*in,loop+2,1,#PB_Ascii))-1)&$3f
      PokeB(*out,actual,((c1<<4)|(c2>>2))&$ff)
      actual+1
      If actual>=outsize
        Break
      EndIf
      c3=(FindString(base64$,PeekS(*in,loop+3,1,#PB_Ascii))-1)&$3f
      PokeB(*out,actual,((c2<<6)|c3)&$ff)
      actual+1
      If actual>=outsize
        Break
      EndIf
    Next
  EndIf
  ProcedureReturn actual
EndProcedure

Procedure$ Base64Encoder(*in,insize)
  index=0
  out$=""
  While index<insize
    b0=PeekB(*in,index)&$ff
    b1=PeekB(*in,index+1)&$ff
    b2=PeekB(*in,index+2)&$ff
    index+3
    out$+Mid(base64$,((b0>>2)&$3f)+1,1)
    out$+Mid(base64$,(((b0<<4)|(b1>>4))&$3f)+1,1)
    out$+Mid(base64$,(((b1<<2)|(b2>>6))&$3f)+1,1)
    out$+Mid(base64$,(b2&$3f)+1,1)
  Wend
  outsize=((Len(out$)+3)/4)*4
  out$=LSet(out$,outsize,"=")
  ProcedureReturn out$
EndProcedure

Procedure.l Base64Decode(string$,*out,outsize)
  If string$<>""
    insize=((Len(string$)+3)/4)*4
    string$=LSet(string$,insize,"=")
    *input=AllocateMemory(insize+10)
    If *input
      PokeS(*input,0,string$,insize,#PB_Ascii)
      actual=Base64Decoder(*input,insize,*out,outsize)
      FreeMemory(*input)
    EndIf
  EndIf
  ProcedureReturn actual
EndProcedure

Procedure$ Base64DecodeString(string$)
  string$=Trim(string$)
  If string$<>""
    outsize=(Len(string$)*1.5)+64
    *out=AllocateMemory(outsize)
    If *out
      actual=Base64Decode(string$,*out,outsize)
      If actual
        result$=PeekS(*out,0,actual,#PB_UTF8)
      EndIf
      FreeMemory(*out)
    EndIf
  EndIf
  ProcedureReturn result$
EndProcedure

Procedure$ Base64EncodeString(string$)
  If string$<>""
    size=Len(string$)*2
    *mem=AllocateMemory(size)
    If *mem
      size=PokeS(*mem,0,string$,-1,#PB_UTF8)
      result$=Base64Encoder(*mem,size)
      FreeMemory(*mem)
    EndIf
  EndIf
  ProcedureReturn result$
EndProcedure

;Schaue mal ab hier...

Procedure CreateCallback(Status, Filename$, File, SizeRead)
  Select Status
    Case #PB_Status_Error
      ; File saving has failed
  EndSelect
EndProcedure

Procedure ReadCallback(Status, Filename$, File, Size)
  If Status = #PB_Status_Loaded
    Debug "File: " + Filename$ + " - Size: " + Size + " bytes"
    *Buffer = ExportFileMemory(0)
    CloseFile(0)
    
    SetGadgetText(1, Base64Encoder(*Buffer, Size)) ;Das ist dein Bild als Base64 - String
    
    FileEnde.s = StringField(Filename$, 2, ".")
    
    Debug "Bild."+FileEnde
    
    If CreateFile(1, "Bild."+FileEnde, @CreateCallback(), #PB_LocalStorage)
      *Bildspeicher = AllocateMemory(Size)
      Base64Decode(GetGadgetText(1), *Bildspeicher, Size)
      For i = 0 To Size
        WriteByte(1, PeekB(*Bildspeicher,i))
      Next i
      If Not OpenFile(2, "Bild."+FileEnde, @CreateCallback(), #PB_LocalFile)
        ExportFile(1, "image/"+FileEnde, #PB_LocalFile)
      EndIf
      CloseFile(1) 
    EndIf
    
  ElseIf Status = #PB_Status_Error
    Debug "Error when loading the file: " + Filename$
  EndIf
EndProcedure

Procedure RequesterSuccess()
  
  ; Process all the selected filename
  ;
  While NextSelectedFile()
    Debug "Filename: " + SelectedFileName()
    OpenFile(0, SelectedFileName(), @ReadCallback(), #PB_LocalFile)
    
  Wend
EndProcedure

Procedure ButtonEvent()
  OpenFileRequester("", @RequesterSuccess(), #PB_Requester_MultiSelection)
EndProcedure

If OpenWindow(0, 100, 100, 200, 240, "File")
  ButtonGadget(0, 10, 10, 180, 25, "Open local file...")
  EditorGadget(1, 10, 40, 180, 190, #PB_Editor_WordWrap)
  BindGadgetEvent(0, @ButtonEvent())
EndIf


Re: Bild hochladen

Verfasst: 26.03.2018 06:16
von stevie1401
Vielen Dank für dein Beispiel.
Ich vermute einmal das hier ist die Zeile wo das Bild umgewandelt wird:

Code: Alles auswählen

SetGadgetText(1, Base64Encoder(*Buffer, Size)) ;Das ist dein Bild als Base64 - String
    
Das ist etwas ungünstig, denn ich kenne bei meinem Beispiel weder *Buffer noch Size

Deshalb noch einmal die Frage:
Wie kann ich in MEINEM Beispiel BILD umwandeln?

Code: Alles auswählen

 bild=CreateImage(#PB_Any,100,100,32,rgb(200,10,30))
erg$=Base64Encoder (*BufferVonBild,SizeVonBild)
Also: Wie komme ich an den *Buffer von BILD und Size von BILD?

Re: Bild hochladen

Verfasst: 27.03.2018 04:51
von ccode_new
Wie kann ich in MEINEM Beispiel BILD umwandeln?
Vielleicht über ExportImage() ?!

Re: Bild hochladen

Verfasst: 27.03.2018 08:53
von Kiffi
ccode_new hat geschrieben:
Wie kann ich in MEINEM Beispiel BILD umwandeln?
Vielleicht über ExportImage() ?!
nein, damit kann man Bilder herunterladen: http://www.spiderbasic.com/documentatio ... image.html

Re: Bild hochladen

Verfasst: 27.03.2018 09:00
von dige
:shock: @ccode_new: Danke für den Hinweis auf ExportFileMemory() ... jetzt habe ich mir mal die SB Befehlsreferenz angeschaut und so einige spannende Dinge entdeckt :D

@stevie1401: entweder du lädst das Bild über ExportFileMemory() in einen Memory Puffer oder du nutzt EncodeImage () um ein Bild zu codieren und in einen Memory Puffer zu übertragen.