Bild hochladen

Hier könnt ihr alle Fragen zu SpiderBasic austauschen.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Bild hochladen

Beitrag 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 ?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Bild hochladen

Beitrag 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.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Bild hochladen

Beitrag 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.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Bild hochladen

Beitrag 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.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Bild hochladen

Beitrag 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))
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Bild hochladen

Beitrag 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

Ich programmiere nur noch mit Linux.
Linux Mint 21.x
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Bild hochladen

Beitrag 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




Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Bild hochladen

Beitrag von RSBasic »

Die Funktion wurde umbenannt:
Geschichte - 2. März 2017 : Version 5.60 hat geschrieben:- Geändert: Base64Decoder() in Base64DecoderBuffer() umbenannt
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Bild hochladen

Beitrag von stevie1401 »

Das weiss ich. Ich bekomme es aber nicht umgeschrieben, da ich das nicht verstehe.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Bild hochladen

Beitrag 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)
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten