Seite 2 von 2

Re: Image Anzahl Limit

Verfasst: 03.02.2017 19:11
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.

Re: Image Anzahl Limit

Verfasst: 03.02.2017 19:40
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.

Re: Image Anzahl Limit

Verfasst: 03.02.2017 19:58
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 ?

Re: Image Anzahl Limit

Verfasst: 04.02.2017 18:30
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  

Re: Image Anzahl Limit

Verfasst: 04.02.2017 19:45
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

Re: Image Anzahl Limit

Verfasst: 04.02.2017 21:02
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.