Seite 5 von 5

Re: Bild hochladen

Verfasst: 28.03.2018 18:13
von ccode_new
Hi stevie1401,

ja mit Purebasic ist das auch weniger ein Problem.

Aber wie macht man das (im Speicher) ohne File-Umweg unter SpiderBasic ?

Re: Bild hochladen

Verfasst: 28.03.2018 18:21
von ccode_new
stevie1401 hat geschrieben: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
  
  
  Debug string
  Debug image
  
  ProcedureReturn Image
EndProcedure



Leider kommt die Fehlermeldung, dass das Image nicht initialisiert sei...
Ich denke du übergibst einfach falsche Werte an die Funktion.

Dein korrekter String muss so lauten:
"iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAABAUlEQVR4nO3RMREAIBDAsJ8RgX8puAIZdMiQvXeds/alY34HYEiaITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITEP2+OMVio7gT0AAAAASUVORK5CYII="

ohne "data:image/png;base64," .

Diesen Text musst du noch eliminieren.

Re: Bild hochladen

Verfasst: 28.03.2018 19:18
von ccode_new
Ich habe mal die vollkommen fehlerhafte Base64-Funktion angepasst und noch etwas wichtigen Offset beigefügt.

Code: Alles auswählen

EnableExplicit

UsePNGImageDecoder() ;Ganz wichtig! Es handelt sich ja um eine PNG-Datei.

#Xml = 0
#Dialog = 0

Global Event, DialogImage, Bild

Global base64.s = "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAABAUlEQVR4nO3RMREAIBDAsJ8RgX8puAIZdMiQvXeds/alY34HYEiaITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITEP2+OMVio7gT0AAAAASUVORK5CYII="

;Ich habe mal die vollkommen verhunste Funktion angepasst.
Procedure DecodeStringToImage(String.s)
  Protected *Buffer, L, *StringAscii
  
  *StringAscii = Ascii(String)
  *Buffer = AllocateMemory(99999) ;StringByteLength(String) ist Blödsinn.
  Base64DecoderBuffer(*StringAscii, MemorySize(*Buffer), *Buffer, MemorySize(*Buffer))
  ;FreeMemory(*StringAscii)
  
  Bild = CatchImage(#PB_Any, *Buffer)
  ;FreeMemory(*Buffer)
  
  Debug string
EndProcedure

If LoadXML(#Xml, GetCurrentDirectory()+"imgdiag.xml") And XMLStatus(#Xml) = #PB_XML_Success
  CreateDialog(#Dialog)
  
  If OpenXMLDialog(#Dialog, #Xml, "ImageTest", 200, 200)
    
    DecodeStringToImage(base64)
    
    DialogImage = DialogGadget(#Dialog, "image_1")
    SetGadgetState(DialogImage, ImageID(Bild))
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
    
  Else
    Debug "Dialog-Error: " + DialogError(#Dialog)
  EndIf
  
Else
  Debug "XML-Fehler: " + XMLErrorLine(#Xml) + ": " + XMLError(#Xml)
EndIf
"imgdiag.xml" : (Erstellt mit einen erstklassigen DialogDesigner (Gruss: HeX0R) )

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>

<dialogs>
  <window name="ImageTest" text="Image-Test" width="800" height="600" flags="#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered" id="0">
    <frame name="frame_1">
      <image name="image_1" flags="#PB_Image_Border" id="img0"/>
    </frame>
  </window>
</dialogs>
So funktioniert es unter PureBasic.

Re: Bild hochladen

Verfasst: 28.03.2018 21:19
von ccode_new
Warum kann man unter Spiderbasic nicht einfach so, oder ähnlich den Encode-String verwenden ?

LoadImage(0, "url(\''"+EncodeImage(bild, #PB_ImagePlugin_PNG)+"'\')")


In JavaScript geht das doch auch ähnlich.

Re: Bild hochladen

Verfasst: 29.03.2018 08:40
von mhs
ccode_new hat geschrieben:Warum kann man unter Spiderbasic nicht einfach so, oder ähnlich den Encode-String verwenden ?

LoadImage(0, "url(\''"+EncodeImage(bild, #PB_ImagePlugin_PNG)+"'\')")


In JavaScript geht das doch auch ähnlich.
Wozu das url() ?

So sollte es doch funktionieren:

Code: Alles auswählen

LoadImage(0, EncodeImage(bild, #PB_ImagePlugin_PNG))

Re: Bild hochladen

Verfasst: 29.03.2018 09:24
von stevie1401
Erst einmal vielen Dank an alle für eure Mithilfe!

Ich bekomme bei der NEUEN Procedure leider immer einen Speicherzugriffsfehler:

Code: Alles auswählen


Procedure DecodeStringToImage(String.s)
  Protected *Buffer, L, *StringAscii,image
  
  *StringAscii = Ascii(String); geht nur mit PB 5.6x
  *Buffer = AllocateMemory(99999) ;StringByteLength(String) ist Blödsinn.
  Base64DecoderBuffer(*StringAscii, MemorySize(*Buffer), *Buffer, MemorySize(*Buffer))  ;hier sagt PB: ungültiger Speicherzugriff (Lesefehler an Adresse 93593600)
  ;FreeMemory(*StringAscii)
  
 image= CatchImage(#PB_Any, *Buffer)
  ;FreeMemory(*Buffer)
   ProcedureReturn Image
  Debug string
EndProcedure


Re: Bild hochladen

Verfasst: 29.03.2018 09:30
von stevie1401
Wie bekomme ich die Procedure unter PB 5.6x lauffähig?

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))  ;<<-- läuft nicht unter PB 5.6x
        FreeMemory(*StringAscii)
      EndIf
    CompilerElse
      ;Alles easy, kein Unicode
      L = Base64Decoder(@String, StringByteLength(String), *Buffer, MemorySize(*Buffer)) ;<<-- läuft nicht unter PB 5.6x
    CompilerEndIf
    
    If L
      Image = CatchImage(#PB_Any, *Buffer, L)
    EndIf
    FreeMemory(*Buffer)
  EndIf
  
  
  Debug string
  Debug image
  
  ProcedureReturn Image
EndProcedure





Re: Bild hochladen

Verfasst: 29.03.2018 09:36
von RSBasic
Die Funktion wurde umbenannt:
Geschichte - 2. März 2017 : Version 5.60 hat geschrieben:- Geändert: Base64Decoder() in Base64DecoderBuffer() umbenannt

Re: Bild hochladen

Verfasst: 29.03.2018 12:06
von stevie1401
Das weiss ich. Ich bekomme es aber nicht umgeschrieben, da ich das nicht verstehe.

Re: Bild hochladen

Verfasst: 29.03.2018 17:27
von ccode_new
Wozu das url() ?

So sollte es doch funktionieren:
Code:
LoadImage(0, EncodeImage(bild, #PB_ImagePlugin_PNG))
Sollte ist gut ;)

Also so funktioniert es bei mir nicht.

Weder mit Firefox, noch mit Opera, .... wird auf dieser Weise ein Bild geladen.

Es geht nur innerhalb von Loaded(Type, Filename$, ObjectId)

Code: Alles auswählen

Global bildchen

Procedure Loaded(Type, Filename$, ObjectId)
  bildchen = ObjectId ;Außerhalb der Funktion nicht zulässig. Warum ?
  Debug bildchen
  SetGadgetState(0, ImageID(ObjectId)) ;So kann man sich helfen.
EndProcedure

BindEvent(#PB_Event_Loading, @Loaded())
BindEvent(#PB_Event_LoadingError, @LoadingError()
LoadImage(100, EncodeImage(bild, #PB_ImagePlugin_PNG))

Anpassung der Funktion.

Code: Alles auswählen

UsePNGImageDecoder() ;Ganz wichtig! Es handelt sich ja um eine PNG-Datei.

Global Bild, base64.s = "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAABAUlEQVR4nO3RMREAIBDAsJ8RgX8puAIZdMiQvXeds/alY34HYEiaITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITEP2+OMVio7gT0AAAAASUVORK5CYII="

Procedure DecodeStringToImage(String.s, Speicher)
  Protected *Buffer, image
  
  *Buffer = AllocateMemory(Speicher) 
  PokeS(*Buffer, String, -1, #PB_Ascii)
  Base64DecoderBuffer(*Buffer, MemorySize(*Buffer), *Buffer, MemorySize(*Buffer))
  image= CatchImage(#PB_Any, *Buffer)
  FreeMemory(*Buffer)
  ProcedureReturn Image
EndProcedure

;Aufruf der Funktion
Bild = DecodeStringToImage(base64, 99999)