Bild in Speicher laden

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Bild in Speicher laden

Beitrag von ProgOldie »

Ich möchte mit dem an der Stelle 'Adresse' gespeicherte Bild
zwei Dinge tun:
1. Es mit setDatabaseBlob() zum Speichern in einer DB vorbereiten
2. Eine auf die Maße W(Breite) und H(Höhe) reduzierte Kopie in einem
ImageGadget mit der Nummer ImGadNr anzuzeigen.

Code: Alles auswählen

#Orig=0
#Resized=1

;---- zu 1. ---------------------
LoadImage(#Orig,Adresse)
ReadFile(0,Adresse)
size_orig = Lof(0)
If size_orig
  *mem_orig = AllocateMemory(size_orig)
  If *mem
    ReadData(0, *mem_orig, size)
    SetDatabaseBlob(DBNr,0,*mem_orig,size_orig) 
  EndIf
EndIf
CloseFile(#Orig)

;---- zu 2.----------------
CopyImage(#Orig,#Resized)
ResizeImage(#Resized,W,H)
*mem_res=EncodeImage(#Resized) 
size_res=MemorySize(*mem_res)
CatchImage(#Resized,*mem_res,size_res)
SetGadgetState(ImGadNr,ImageID(#Resized))

;(Speicherfreigaben jeweils weggelassen)
Ich habe Sorge, mir bei einem Fehler durch einen Test den Speicher zu ruinieren. Daher:
a) Ist das Fragment so richtig?
b) Muss(!) man bei EncodeImage() auch noch das Bildformat bei den Parametern angeben, oder
reicht es, den passenden Decoder bzw. alle Decoder zu laden?
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Bild in Speicher laden

Beitrag von HeX0R »

Nach dem ResizeImage hast Du doch bereits deine ImageID, wozu spielst Du da noch mit dem Speicher rum?
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Bild in Speicher laden

Beitrag von ProgOldie »

Hallo HeXOR, zunächst danke.

Code: Alles auswählen

CopyImage(#Orig,#Resized)
ResizeImage(#Resized,W,H)
;...Herumspielerei im Speicher weggelassen 
SetGadgetState(ImGadNr,ImageID(#Resized))
So müsste es dann richtig sein.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Bild in Speicher laden

Beitrag von ProgOldie »

Noch eine Frage dazu. Wie gehe ich vor, wenn ich ein Bild als BLOB geladen habe und im Imagegadget anzeigen will, wobei die Bildabmessungen auf die Größe W(Breite) und H(Höhe) resized sein soll?

Code: Alles auswählen

size = DatabaseColumnSize(DBNr,1)
If size
  *mem = AllocateMemory(size)
  If *mem
    If GetDatabaseBlob(DBNr,1, *mem, size)
      ImID=CatchImage(#PB_Any, *mem,size)
      SetGadgetState(ImGadNr,ImageID(ImID))
    EndIf 
  EndIf
EndIf 

Wie baut man darin resizeImage() ein?
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Bild in Speicher laden

Beitrag von mhs »

Ganz einfach, du führst ResizeImage auf die ImID aus, die du von CatchImage erhalten hast:

Code: Alles auswählen

size = DatabaseColumnSize(DBNr,1)
If size
  *mem = AllocateMemory(size)
  If *mem
    If GetDatabaseBlob(DBNr,1, *mem, size)
      ImID=CatchImage(#PB_Any, *mem,size)

      ResizeImage(ImID, W, H)

      SetGadgetState(ImGadNr,ImageID(ImID))
    EndIf 
  EndIf
EndIf 

Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Bild in Speicher laden

Beitrag von ProgOldie »

Danke, auf die einfachsten Dinge kommt man oft nicht.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Antworten