ImgLoad - Image Loader und Ladebalken

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

ozzi789

Betreff: ImgLoad - Image Loader und Ladebalken

BeitragMo, Nov 30, 2009 21:28
Antworten mit Zitat
Benutzer-Profile anzeigen
ImgLoad ist eine kleine Funktionssammlung welche hilft Bilder zu laden / verwalten


Die Funktionen ermöglichen das Laden aller Bilder in einem Ordner, diese Bilder werden als Type gespeichert, es wird eine ID, ein Handle, den Namen, den Pfad zum Bild, die Filegrösse (in KB) und die Grösse (X-Y) gespeichert.

Dies erleichtert dem einem oder anderen einiges an Arbeit, dazu wird die Gesamtgrösse der Bilder errechnet, es werden Variabeln erstellt die einem ermöglichen einen Ladebalken einfach darzustellen, dieser Ladebalke zeigt sehr genau den tatsächlichen Ladefortschritt an!

Ein Bild wird ganz einfach ausgegeben, drawimagep(name,x,y) in der Funktion wird das Type durchsucht und den passenden Handle rausgesucht, für optimalen Komfort :O

Nun kann man auch ein Bildzeichnen, und dazu ganz einfach die Grösse daneben schreiben, euch sind keine Grenzen gesetzt! ^^


Todo:
Bilder löschen
Per ID sortieren oder nacheinander abspielen
An der Performance basteln
jpeg bilder sollen auch geladen werden, nicht "nur" jpg Wink


Wünsche?

mfg & hf ozzi

Funktionen:

->drawbar() , nur ein Dummy zum Zeichnen des Balken
->load(pfad$,draw), liest alle Bilder aus einem Ordner ein, wenn draw=1 dann wird der Ladebalken gezeichnet
->show(mode), bei mode=1 wird der Type Inhalt mittels Print, bei mode=2 mittels Debuglog ausgeben
->updatebar(), updaten die Variablen für den Ladebalken



BlitzBasic: [AUSKLAPPEN]

;ImgLoad, by ozzi789
;11.2k9

Global id,gesamt#,current,currentproz#
Type picture
Field idp
Field handle_p
Field name$
Field pfad$
Field size
Field x
Field y
End Type


Function drawbar()
Color 255,0,0
Rect 1*currentproz#-14,0,25,10
AppTitle (Left(currentproz,2)+"%")
Flip 0
End Function




Function drawimagep(drawhandle$,drawx,drawy)
For p.picture = Each picture
If p\name$=drawhandle$
DrawImage p\handle_p,drawx,drawy
Exit
EndIf
Next
End Function

Function load(pfad$,draw)
If Right(pfad$,1)<>"\" Then pfad$=pfad$+"\"

Verz = ReadDir(pfad$)
Repeat
Datei$ = NextFile$(Verz)
If Datei$ = "" Then Exit
If FileType(pfad$ + Datei$) = 1
gesamt# = gesamt# + FileSize(pfad$ + Datei$)/1000
EndIf
Forever
CloseDir Verz


Verz = ReadDir(pfad$)
Repeat
Datei$ = NextFile$(Verz)
If Datei$ = "" Then Exit
If FileType(pfad$ + Datei$) = 1
ending$=Right(Datei$,3)
ending$=Lower(ending$)
If ending$="jpg" Or ending$="png" Or ending$="bmp"
id=id+1
link$=pfad$+Datei$
p.picture = New picture
p\idp = id
p\handle_p = LoadImage(link$)
If p\handle_p=0 RuntimeError "This File ''"+Datei$+"'' was not an image!"
p\name$ = Left(Datei$,Len(Datei$)-4)
p\pfad$ = link$
p\size = FileSize(link$)/1000
current=current+p\size
updatebar()
If draw=1 drawbar()
p\x = ImageWidth(p\handle_p)
p\y = ImageHeight(p\handle_p)
EndIf
End If
Forever
CloseDir Verz
AppTitle ("100%")
End Function

Function updatebar()
faktor#=100/gesamt#
currentproz#=current*faktor#
End Function

Function show(mode)
If mode=1
For p.picture = Each picture
Print "__________"
Print p\idp
Print p\handle_p
Print p\name$
Print p\pfad$
Print p\size
Print p\x
Print p\y
Next
Else If mode=2
For p.picture = Each picture
DebugLog "__________"
DebugLog p\idp
DebugLog p\handle_p
DebugLog p\name$
DebugLog p\pfad$
DebugLog p\size
DebugLog p\x
DebugLog p\y
Next
DebugLog "----"
DebugLog gesamt
Else If mode=0
Else
RuntimeError "invalid show mode!"
EndIf
End Function





Anwendungsbeispiel (pfad anpassen!)


BlitzBasic: [AUSKLAPPEN]


;ImgLoad, by ozzi789
;11.2k9

Graphics 800,600,32,2
SetBuffer BackBuffer()
Global id,gesamt#,current,currentproz#

Type picture
Field idp
Field handle_p
Field name$
Field pfad$
Field size
Field x
Field y
End Type


Color 100,100,100
Rect 0,0,120,25
load("C:\Users\ozzi\Pictures\TEST",1)
show(2)
Cls
drawimagep("test",100,0)
Flip
WaitKey
End

Function drawbar()
Color 255,0,0
Rect 1*currentproz#-14,0,25,10
AppTitle (Left(currentproz,2)+"%")
Flip 0
End Function




Function drawimagep(drawhandle$,drawx,drawy)
For p.picture = Each picture
If p\name$=drawhandle$
DrawImage p\handle_p,drawx,drawy
Exit
EndIf
Next
End Function

Function load(pfad$,draw)
If Right(pfad$,1)<>"\" Then pfad$=pfad$+"\"

Verz = ReadDir(pfad$)
Repeat
Datei$ = NextFile$(Verz)
If Datei$ = "" Then Exit
If FileType(pfad$ + Datei$) = 1
gesamt# = gesamt# + FileSize(pfad$ + Datei$)/1000
EndIf
Forever
CloseDir Verz


Verz = ReadDir(pfad$)
Repeat
Datei$ = NextFile$(Verz)
If Datei$ = "" Then Exit
If FileType(pfad$ + Datei$) = 1
ending$=Right(Datei$,3)
ending$=Lower(ending$)
If ending$="jpg" Or ending$="png" Or ending$="bmp"
id=id+1
link$=pfad$+Datei$
p.picture = New picture
p\idp = id
p\handle_p = LoadImage(link$)
If p\handle_p=0 RuntimeError "This File ''"+Datei$+"'' was not an image!"
p\name$ = Left(Datei$,Len(Datei$)-4)
p\pfad$ = link$
p\size = FileSize(link$)/1000
current=current+p\size
updatebar()
If draw=1 drawbar()
p\x = ImageWidth(p\handle_p)
p\y = ImageHeight(p\handle_p)
EndIf
End If
Forever
CloseDir Verz
AppTitle ("100%")
End Function

Function updatebar()
faktor#=100/gesamt#
currentproz#=current*faktor#
End Function

Function show(mode)
If mode=1
For p.picture = Each picture
Print "__________"
Print p\idp
Print p\handle_p
Print p\name$
Print p\pfad$
Print p\size
Print p\x
Print p\y
Next
Else If mode=2
For p.picture = Each picture
DebugLog "__________"
DebugLog p\idp
DebugLog p\handle_p
DebugLog p\name$
DebugLog p\pfad$
DebugLog p\size
DebugLog p\x
DebugLog p\y
Next
DebugLog "----"
DebugLog gesamt
Else If mode=0
Else
RuntimeError "invalid show mode!"
EndIf
End Function


0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
  • Zuletzt bearbeitet von ozzi789 am Di, Dez 01, 2009 21:21, insgesamt einmal bearbeitet
 

BBPro2

BeitragMo, Nov 30, 2009 23:14
Antworten mit Zitat
Benutzer-Profile anzeigen
sehe leider keinen großen nutzen, da die performance furchtbar wird bei vielen bildern
(type linear durchsuchen um ein bild zu zeichnen, statt das handle direkt zu verwenden)

und ein ladebalken am anfang mag ja hübsch sein - aber dafür bei jedem einzigen zeichen-befehl
zeit verlieren ? lieber nicht Smile

oder hab ich was falsch verstanden/fällt dir ein anwendungsgebiet ein bei dem das ganze sinn macht?

Eingeproggt

BeitragMo, Nov 30, 2009 23:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wenn schon durchsuchen, dann bei einem Fund wenigstens noch Exit benutzen, so zB:

Code: [AUSKLAPPEN]
Function drawimagp(drawhandle$,drawx,drawy) ; Bildanzeigen
   For p.picture = Each picture
      If p\name$=drawhandle$
         DrawImage p\handle_p,drawx,drawy
         Exit
      EndIf
   Next
End Function


Vielleicht kannst du, um den von BBPro2 angesprochenen Kritikpunkt ein wenig auszubessern ne 2. Function machen wie "DrawImgDirect" oder so, wo man das Handle angibt. Und die Leute die es bequemer haben wollen die nehmen deine jetzige Funktion.

An sich kann der eine oder andere dein Werk sicher mal brauchen (Wenn ich dran denke wieviele nach dem Ladebalken fragen ^^) aber ich persönlich dreh da lieber mein eigenes Ding.
Kleine Kritik noch am Rande: "drawimagp" is doch ne fürchterliche Functionsbezeichnung...
[EDIT] Hab den Lade-Code durchgeschaut und noch 2 Sachen:
Warum nicht Flip 0 beim Fortschrittsbalken?
Was bringt das? Hast du vergessen n Backshlash in die Anführungszeichen zu setzen? Wink
Code: [AUSKLAPPEN]
If Right(pfad$,1)<>"" Then pfad$=pfad$+"" ; Falls es am Ende kein \ hat ergänzen


mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

ozzi789

BeitragDi, Dez 01, 2009 8:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh danke für das Feedback Smile jep das exit muss dort hin..
Ja ich lass mir was einfallen wie man sonst noh optimieren kann

und ne funktion die direkt den handle anspricht werd ich noch einbauen


Jep da fehlt ein \ Wink


mfg
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

ToeB

BeitragDi, Dez 01, 2009 16:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Sry aber ich finde die Idee mit dem durchsuchen sehr schwachsinnig. Lieber eine Function mehr schreiben die ein Handle für einen Namen rausschreibt als immer wieder neu durchsuchen zu lassen. Hätte immer noch komfort. Weil so müsste für 1000 gemalte Bilder in einer Schleife nicht immer alles durchsucht werden, sondern einmal, vor oder in der Schleife ist mir egal, aber dann braucht man nur das Handle.

Sonst gute idee ^^

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

ozzi789

BeitragDi, Dez 01, 2009 21:26
Antworten mit Zitat
Benutzer-Profile anzeigen
So habe das Exit eingebaut und etwas verbessert.

Dazu habe ich mal gemessen, bei 524 Bildern im Typ dauerte es genau mal 0 Millisecs um den richtigen Eintrag zu finden und zu zeichen, sollte schnell genug sein oder? Very Happy

Wie mein ihr direkt zeichen? Also direkt den Handle
das man zmb bild.png als handle benützt?

Ich dachte eher an -> Blitz Array dort drinn wird Handle (bild1 bild2 und die dazugehörige ID) gespeichert, nun sucht man findet die ID und springt zu diesem Type, was denkt ihr ist das besser? (sollte ja noch etwas schneller sein)


mfg ozzi
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

BBPro2

BeitragDi, Dez 01, 2009 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
naja 1. 524 bilder muss nicht unbedingt viel sein
2. 0 millisekunden auf welchem pc Wink ís ja nich jeder pc gleich schnell... Smile

ozzi789

BeitragDi, Dez 01, 2009 22:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Nuja ein BB durchschnitts Game wird wohl nicht so schnell über 524 bilder kommen oder? Very Happy
Joa auf meinem PC siehe sig @home ;D

Wäre froh wenn du
(type linear durchsuchen um ein bild zu zeichnen, statt das handle direkt zu verwenden)

die Sache mit dem direkt verlinken erklären würdest


mfg Smile
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

n-Halbleiter

BeitragDi, Dez 01, 2009 23:36
Antworten mit Zitat
Benutzer-Profile anzeigen
OH Handle und Object meine ich...

Falls du das überhaupt nicht willst, wäre vielleicht ein Tree mit Keys eine Idee? Wäre dann "nur" O(log(n)) anstatt O(n). Wink
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)
 

BBPro2

BeitragMi, Dez 02, 2009 0:34
Antworten mit Zitat
Benutzer-Profile anzeigen
ozzi789 hat Folgendes geschrieben:
Nuja ein BB durchschnitts Game wird wohl nicht so schnell über 524 bilder kommen oder? Very Happy
Joa auf meinem PC siehe sig @home ;D

Wäre froh wenn du
(type linear durchsuchen um ein bild zu zeichnen, statt das handle direkt zu verwenden)

die Sache mit dem direkt verlinken erklären würdest


mfg Smile


Code: [AUSKLAPPEN]


Function drawimagep(drawhandle$,drawx,drawy)
For p.picture = Each picture
If p\name$=drawhandle$
DrawImage p\handle_p,drawx,drawy
Exit
EndIf
Next
End Function




hier liegt das problem
wenn ich 1000 bilder habe die die namen "peter1", "peter2", ... "peter1000" in eben dieser
reihenfolge haben und so im type gespeichert werden (insbesondere in dieser reihenfolge)

habe ich ein laufzeitproblem wenn ich später sagen wir 100 mal auf das bild "peter1000"
zugreifen möchte.

anstatt
drawimage peter1000, 0, 0

würde dein programm jedes mal in diesen 100 fällen den gesamten type durchlaufen und
nach dem entsprechenden bild suchen um es zu zeichnen

hierbei würde es genau 999 * 100 mal "sinnlos" feststellen, dass es weitersuchen muss bis es
das richtige bild findet.

wenn du einen stapel von cds hast der senkrecht auf dem boden steht - würdest du deine lieblingscd nur sehr ungern ganz unten liegen haben und jedes mal wenn du sie brauchst von ganz unten rauskramen müssen.
du würdest sie dir aus dem stapel rauslegen damit du sie immer "direkt" hören kannst.
dein programm legt sie aber immer wieder unten hin Wink


das problem lässt sich nicht wirklich beheben, da die grundstruktur deines programms eben genau das verlangt.
ich sage nicht dass es schlecht programmiert ist (sicher geht es besser, aber an sich machst du das was du tun musst) - ich sage nur dass für mich diese funktion nicht in frage käme da sie laufzeit frisst - unweigerlich.


im übrigen ist dein pc deutlich stärker als ein durchschnittspc wodurch deine aussage von 0 ms nicht
aussagekräftig wird Smile

ozzi789

BeitragMi, Dez 02, 2009 9:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe soeben eine gute Idee gehabt, ich sortiere die Handels im Type alphabetisch.
Dann springe ich in die Mitte des Types, ist der Handle name "kleiner" als M suche ich nur in der ersten Hälfte im Type, wenn nicht im der zweiten Häflte
(SQL macht das doch änhlich)

Oder

Ich mach es so das alle Bilder umbennant werden zmb
Bild.png -> Bild.pic
Bild2.jpg -> Bild2.pic

So wird das ganze überflüssig wenn ich jetzt zum bsp drawimagep (bild2) mache füge ich einfach .pic aus und hole es mittels dem Pfad direkt raus...

Oder

Ich erstelle einen Array, mit 2 Spalten.
In der ersten Steht der Name in der zweiten der Handle
Gleiches verfahren wie zuvor aber ich denke mal der Array ist schneller als der Type ?

mfg
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

BBPro2

BeitragMi, Dez 02, 2009 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
das problem an type ist: du KANNST nicht in die mitte des types springen
und auf diese art suchen.
wie willste das denn machen ?

und ja fast alle programmiersprachen etc unterstützen eine solche suche
sie heißt binäre suche und hat O(log n) was deutlich schneller ist als
das von dir vorgestellte.
aber wie gesagt - mit types und ohne vorherige sortierung ist das nicht
umsetzbar

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group