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:
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)