Image Anzahl Limit

Anfängerfragen zum Programmieren mit PureBasic.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Image Anzahl Limit

Beitrag von ccode_new »

Oh :shock:

Naja wenn man schon viel Arbeitsspeicher hat kann man den ja auch nutzen. :allright:

Das ganze Programm ist halt nicht sehr schnell beim "Laden", oder?

Sehr optimal finde ich die Lösung ja nicht, aber warum nicht ?!

Du kannst ja trotzdem immer mal ein paar Bilder aus dem Speicher nehmen und wieder welche hinzufügen.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Image Anzahl Limit

Beitrag von GPI »

so viel würden die Bilder nicht einnehmen, wenn sie 32x32 sind
Ich würde halt die Speicher mit *Puffer = EncodeImage(#Image [, ImagePlugin [, Flags [, Tiefe]]]) sichern und dann mit catchimage() wieder laden.
Das ganze halt in einer MAP oder so speichern. Freigeben nicht vergessen.
Wobei die Frage ist, ob man ein 32x32 großes Bild nicht einfach schnell neu zeichnen kann. Das dürfte bei den heutigen PCs geschwindigkeitsmäßig kaum einen Unterschied machen.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Image Anzahl Limit

Beitrag von ccode_new »

Ich bin einfach mal neugierig.

Soll das eigentlich eine Art Explorer mit "Thumbnails" werden, oder eine scrollbare Kartendarstellung, .... ?

Oder einfach nur ein Test, oder etwas ganz Anderes ?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: Image Anzahl Limit

Beitrag von uweb »

Code: Alles auswählen

Declare CopyImageToMem(Img.l, *mem)
Declare CopyMemToImage(Img.l, *mem)

CountOfIcons=100000
w = 32
h = 32
cb = 3 ; color bytes (3 or 4)
ims = w*h*cb ; image memory size
*buffer = AllocateMemory(CountOfIcons * ims)

For x = 0 To CountOfIcons
  i=CreateImage(#PB_Any , w, h, cb*8, RGB(Mod(x,255),Mod(x,223),Mod(x,191)))
  CopyImageToMem(i, *buffer + ims*x)
  FreeImage(i)
Next
x=0

OpenWindow(0, 96, 96, 160, 96, "Only one ImageID")
Target=CreateImage(#PB_Any, w, h, cb*8, RGB(255,255,255))
ImageGadget(0, 32, 32, w, h, ImageID(Target), #PB_Image_Border) 
AddWindowTimer(0, 0, 10)
Repeat
  Event = WaitWindowEvent()
  If (Event = #PB_Event_Timer)
    x+1 : If x = CountOfIcons : x = 0 : EndIf
    CopyMemToImage(Target, *buffer + ims*x)
    SetGadgetState(0, ImageID(Target))
  EndIf
Until Event = #PB_Event_CloseWindow

; http://www.purebasic.fr/german/viewtopic.php?t=1164 :

Procedure CopyImageToMem(Img.l, *mem)
  Protected bmi.BITMAPINFO
  Protected w.l, h.l, hBmp.l, hDC.l
  
  w = ImageWidth(Img)
  h = ImageHeight(Img)
  hBmp = ImageID(Img)
  
  bmi\bmiHeader\biSize        = SizeOf(BITMAPINFOHEADER)
  bmi\bmiHeader\biWidth       =  w
  bmi\bmiHeader\biHeight      =  h
  bmi\bmiHeader\biPlanes      =  1
  bmi\bmiHeader\biBitCount    =  32
  bmi\bmiHeader\biCompression = #BI_RGB
  
  hDC = StartDrawing(ImageOutput(Img))
  If GetDIBits_(hDC, hBmp, 0, h, *mem, bmi, #DIB_RGB_COLORS)
    StopDrawing()
    ProcedureReturn #True
  Else
    StopDrawing()
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure CopyMemToImage(Img.l, *mem)
  Protected bmi.BITMAPINFO
  Protected w.l, h.l, hBmp.l, hDC.l
  
  w = ImageWidth(Img)
  h = ImageHeight(Img)
  hBmp = ImageID(Img)
  
  bmi\bmiHeader\biSize        = SizeOf(BITMAPINFOHEADER)
  bmi\bmiHeader\biWidth       =  w
  bmi\bmiHeader\biHeight      =  h
  bmi\bmiHeader\biPlanes      =  1
  bmi\bmiHeader\biBitCount    =  32
  bmi\bmiHeader\biCompression = #BI_RGB
  
  hDC = StartDrawing(ImageOutput(Img))
  If SetDIBits_(hDC, hBmp, 0, h, *mem, bmi, #DIB_RGB_COLORS)
    StopDrawing()
    ProcedureReturn #True
  Else
    StopDrawing()
    ProcedureReturn #False
  EndIf
EndProcedure  
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Re: Image Anzahl Limit

Beitrag von KeyKon »

@GPI: Genau so mache ich es auch, hab ich ja geschrieben "die Images als BMP in den Speicher sichern"^^
Kostet halt einen gewissen Verwaltungsaufwand den ich wenn es eine einfache Möglichkeit gäbe gern wieder rausgeworfen hätte.
32x32 war nur ein Beispiel, je nach Auflösung sind die Elemente eher größer und dazu kommen auch noch Thumbnails die nach bedarf geladen werden.

@ccode_new: Ladezeit gibt es nicht, es wird asynchron geladen was angezeigt werden soll, solange es noch nicht bereit ist wird ein Platzhalter angezeigt und das ist nunmal eine unschöne zehntel Sekunde. Daher lasse ich alles was schon geladen wurde im Speicher, ohne drüber nachzudenken ob es nochmal gebraucht wird oder nicht.
Das Ganze ist ein Overlay für einen Videoplayer. In erster Linie um Stellen im Video zu Taggen damit ich sie später beim Schneiden eines Projekts besser finde (mangels vernünftigem Schnittprogramm xD)

THX @uweb, werde mir mal anschauen ob das schneller ist als Encode und CatchImage.

LG KeyKon
(\/) (°,,,°) (\/)
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: Image Anzahl Limit

Beitrag von uweb »

Gerne!
Die Prozeduren selbst sind vermutlich nicht schneller. Du hast aber einen durchgehenden Speicherblock. EncodeImage gibt einen Zeiger zurück. Bei CopyImageToMem bestimmst Du ihn. Der Vorteil würde sich also aufs Speichern beschränken.
PS
Ich mache nicht so viel mit Bildern und war mir deswegen nicht sicher ob es problemlos möglich ist mit CatchImage das gleiche Image beliebig oft zu überschreiben. Wegen dem durchgehenden Speicherblock habe ich es gar nicht erst probiert.
Antworten