Bild hochladen
Re: Bild hochladen
Hi stevie1401,
ja mit Purebasic ist das auch weniger ein Problem.
Aber wie macht man das (im Speicher) ohne File-Umweg unter SpiderBasic ?
ja mit Purebasic ist das auch weniger ein Problem.
Aber wie macht man das (im Speicher) ohne File-Umweg unter SpiderBasic ?
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
Re: Bild hochladen
Ich denke du übergibst einfach falsche Werte an die Funktion.stevie1401 hat geschrieben:Ich versuche gerade den decodierten String mit dieser Funktion mit Purebasic wieder in ein Image zu verwandeln:
Leider kommt die Fehlermeldung, dass das Image nicht initialisiert sei...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
Dein korrekter String muss so lauten:
"iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAABAUlEQVR4nO3RMREAIBDAsJ8RgX8puAIZdMiQvXeds/alY34HYEiaITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITGGxBgSY0iMITEP2+OMVio7gT0AAAAASUVORK5CYII="
ohne "data:image/png;base64," .
Diesen Text musst du noch eliminieren.
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
Re: Bild hochladen
Ich habe mal die vollkommen fehlerhafte Base64-Funktion angepasst und noch etwas wichtigen Offset beigefügt.
"imgdiag.xml" : (Erstellt mit einen erstklassigen DialogDesigner (Gruss: HeX0R) )
So funktioniert es unter PureBasic.
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
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>
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
Re: Bild hochladen
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.
LoadImage(0, "url(\''"+EncodeImage(bild, #PB_ImagePlugin_PNG)+"'\')")
In JavaScript geht das doch auch ähnlich.
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
Re: Bild hochladen
Wozu das url() ?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.
So sollte es doch funktionieren:
Code: Alles auswählen
LoadImage(0, EncodeImage(bild, #PB_ImagePlugin_PNG))
Michael Hack
Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
-
- Beiträge: 659
- Registriert: 19.10.2014 15:51
- Kontaktdaten:
Re: Bild hochladen
Erst einmal vielen Dank an alle für eure Mithilfe!
Ich bekomme bei der NEUEN Procedure leider immer einen Speicherzugriffsfehler:
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
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Linux Mint 21.x
-
- Beiträge: 659
- Registriert: 19.10.2014 15:51
- Kontaktdaten:
Re: Bild hochladen
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
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Linux Mint 21.x
Re: Bild hochladen
Die Funktion wurde umbenannt:
Geschichte - 2. März 2017 : Version 5.60 hat geschrieben:- Geändert: Base64Decoder() in Base64DecoderBuffer() umbenannt
-
- Beiträge: 659
- Registriert: 19.10.2014 15:51
- Kontaktdaten:
Re: Bild hochladen
Das weiss ich. Ich bekomme es aber nicht umgeschrieben, da ich das nicht verstehe.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Linux Mint 21.x
Re: Bild hochladen
Sollte ist gutWozu das url() ?
So sollte es doch funktionieren:
Code:
LoadImage(0, EncodeImage(bild, #PB_ImagePlugin_PNG))
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)
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat