Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Problem bei einem Jpeg-Loader

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Leader4



Anmeldungsdatum: 20.01.2005
Beiträge: 99
Wohnort: Leipzig

BeitragVerfasst am: 08.09.2007, 10:01    Titel: Problem bei einem Jpeg-Loader Antworten mit Zitat

Hallo,


ich habe folgende Funktion zum Laden von Jpeg-Bildern in meinem Programm (die Funktion ist nicht von mir, aber ich hab die Funktion direkt hier im Forum gefunden):

Code:
 BildladerQF:
    '
    '
    '
    Dim Image2 As Any Ptr
    '
    '
    ScreenRes 800, 600, 32
    '
    '
    Image2 = GetJpeg2(Bilderpfad$)      'Pfad des zu ladenden Bildes
    If Image2 Then
        Put (0, 0), Image2
    Else
        Print "File not found"
    End If
    '
    '
    '
    Function GetJpeg2(Byval File As String) As Any Ptr
        Dim Dib As FIBITMAP Ptr
        Dim Dib32 As FIBITMAP Ptr
        Dim SprWidth As Integer
        Dim SprHeight As Integer
        Dim Sprite As Any Ptr
        Dim Bits As Any Ptr
        Dib = FreeImage_Load(FIF_JPEG, File, JPEG_DEFAULT)
        If Dib = 0 Then Return 0
    '
        FreeImage_FlipVertical Dib
        Dib32 = FreeImage_ConvertTo32Bits(Dib)
    '   
        Dib32 = FreeImage_Rescale (Dib32, 800, 600, 0)
    '   
        SprWidth = FreeImage_GetWidth(Dib32)
        SprHeight = FreeImage_GetHeight(Dib32)
        Sprite = ImageCreate(SprWidth, SprHeight)
        Bits = FreeImage_GetBits(Dib32)
    '   
        MemCpy CPtr(Zstring Ptr, Sprite) + 4, Bits, SprWidth * SprHeight * 4
    '   
        FreeImage_Unload(Dib32)
        FreeImage_Unload(Dib)
    '
        Return Sprite
    End Function
    '
    '
    '
    '
    '
    Return



Die Funktion lädt problemlos die gewünschten Bilder (etwa 1 Sekunde pro Bild). Ich besitze aber eine Bilderdatenbank, wo ich oft sehr viele Fotos anschauen möchte (Bildbetrachter, Diashow etc.). Das Problem ist, dass etwa nach dem 20. Bild die Ladezeit immer länger wird bzw. das Programm/das System kurz vorm Aufhängen ist. Die Ladezeit übersteigt dann schnell 5 Sekunden oder das Programm fährt für eine halbe Minute fest.

Hat jemand eine Ahnung, woran das liegen kann? Ich hab die Funktion nicht wirklich verstanden, das heißt, ich weiß nicht, was ich ändern soll/kann, um das Problem evtl. zu beheben. Vielleicht kann mir jemand einen Tipp geben, was man am Code ändern kann.


Noch ein kleiner Hinweis, wie ich die Funktion bspw. verwende (vielleicht liegt dort schon der Fehler):


Code:
 Diashow:   

Randomize Timer
Zufall = Int(Anzahl.Bilder * Rnd) + 1

Pfad$ = GetPfad ( Registry$(Zufall,1)  )


T1# = Timer
Do

    T$ = Inkey$
    If T$=CHR(255,107) Then Gosub ENDE:
 
    If T$=Chr$(27) Then                        ' Beenden Anzeigen von Zufallsbildern
        Screen 19
        Goto 100
    End If

    If T$ = Chr$(13) Then Gosub Diashow    ' Zeigt neues Zufallsbild an (rekursiv)
    '
    If Timer-T1# > Popt.Dia Then Gosub Diashow    ' Halte Bild für Popt.Dia Sekunden fest
    '
Loop
'



Vielen Dank für eure Hilfe zwinkern
_________________
Ein richtiger Programmierer muss so richtig faul sein und sich den ganzen Tag mit der Frage beschäftigen, wie man mal wieder etwas einfacher machen kann.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 08.09.2007, 10:06    Titel: Antworten mit Zitat

Ich nehme an, das Du schlicht vergisst, den Speicher wieder frei zu geben... bei jeden geladenen Bild 'reservierst' Du Speicher, bringst es auf den Bildschirm [an dieser stelle muss der Speicher wieder freigegeben werden] und laedst das naechste Bild, wo wieder Speicher reserviert wird (der alte ist aber auch noch reserviert)

also um es kurz zu machen grinsen
nachdem Du das bild mit Put auf den Bildschirm gebracht hast,
machst Du einfach ein
Code:
ImageDestroy(Image2)

Und laedst erst dann das naechste Bild, damit sollte Dein Problem behoben sein zwinkern
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 08.09.2007, 10:11    Titel: Antworten mit Zitat

Tja, wollte ich auch gerade sagen, war mal wieder zu langsam lächeln
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Leader4



Anmeldungsdatum: 20.01.2005
Beiträge: 99
Wohnort: Leipzig

BeitragVerfasst am: 08.09.2007, 10:58    Titel: Antworten mit Zitat

Vielen Dank euch, jetzt geht schon um einiges besser.


mfg,
Leader4
_________________
Ein richtiger Programmierer muss so richtig faul sein und sich den ganzen Tag mit der Frage beschäftigen, wie man mal wieder etwas einfacher machen kann.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 09.09.2007, 03:44    Titel: Antworten mit Zitat

wenn es um viele Bilder geht, könnte das hier evvtl. auch noch interessant sein...
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz