Problem mit TImage in einer Schleife



  • Hallo Leute

    Ich dreh hier gerade fast durch...
    Folgendes funktioniert:

    for (int i=0;i<5; i++)
    {
    Image1->Picture->LoadFromFile(Path+Dateien->Strings[i]);
    Sleep(2000);
    Label1->Caption=IntToStr(i);
    Application->ProcessMessages();
    }
    

    Es werden mir brav nacheinander die Bilder angezeigt.
    Das Sleep(2000) habe ich nur zu Testzwecken eingebaut.
    Soweit so gut.
    Wenn ich aber das hier laufen lasse, zeigt er mir noch nicht einmal ein Bild mehr an:

    for (int i=0;i<5; i++)
    {
    Image1->Picture->LoadFromFile(Path+Dateien->Strings[i]);
    Sleep(2000);
    SetAviVideoCompression(avi,Image1->Picture->Bitmap->Handle,&opts,false,Form1->Handle);
    AddAviFrame(avi,Image1->Picture->Bitmap->Handle);
    Label1->Caption=IntToStr(i);
    Application->ProcessMessages();
    }
    

    Wie kann es sein, dass SetAviVideoCompression und AddAviFrame einen Einfluss auf den Ablauf haben, obwohl sie noch garnicht ausgeführt wurden?
    Natürlich wird auch kein Avi erzeugt.
    Hat vielleicht jemand eine Ahnung?

    Ich wäre sehr dankbar, denn ich schlage mich schon den ganzen Tag mit dem Problem rum.
    Wenn noch was erklärungsbedürftig ist, bitte Fragen !

    Danke Euch

    Aysel



  • Hallo,

    ein einfaches Image->Repaint() dürfte schon reichen.
    Hier mal mein Vorschlag:

    const char *fns[] = {"pic001.bmp","pic002.bmp","pic003.bmp","pic004.bmp","pic005.bmp"};
       HAVI avi = CreateAvi("test.avi", 1000, NULL);
       for (int i=0; i< sizeof(fns)/ sizeof(fns[0]); i++) {
           Image1->Picture->Bitmap->LoadFromFile(fns[i]);
           Image1->Repaint();
           Application->ProcessMessages();
           Sleep(2000);  // zum Betrachten :))
    
           if (i==0) {
               AVICOMPRESSOPTIONS opts; ZeroMemory(&opts,sizeof(opts));
               opts.fccHandler=mmioFOURCC('d','i','v','x');
               SetAviVideoCompression(avi,Image1->Picture->Bitmap->Handle,&opts,false,Form1->Handle);
           }
           AddAviFrame(avi,Image1->Picture->Bitmap->Handle);
       }
       CloseAvi(avi);
    

    Hinweis: Wie es aussieht, setzt du gegenüber dem Originalcode nicht if (i==0) .Oder?
    In dieser Schleife wird der Dialog zum Festlegen der Komprimierungsart aufgerufen.

    Und Frage: das ist der Originalcode?

    mfg
    kpeter



  • Hallo
    Ja das ist der original code.
    Werds mal so probieren wie Du es vorschlägst...
    Danke erstmal !!!

    Aysel



  • Hurra!!!
    Es geht!
    Ich Danke Dir herzlichst, Kpeter !!!

    Aysel



  • Halt. Kommando zurück.
    Es wird kein Avi erzeugt 😞

    Folgendes habe ich jetzt:

    void __fastcall TForm1::AviErzeugenExecute(TObject *Sender)
    {
    HAVI avi = CreateAvi("test.avi",100,NULL);
    for (int i=0;i<Dateien->Count-1; i++)
    {
    Image1->Picture->LoadFromFile(Path+Dateien->Strings[i]);
    Image1->Repaint();
    Application->ProcessMessages();
    //Sleep(2000);
    	   if (i==0) {
    		   AVICOMPRESSOPTIONS opts; ZeroMemory(&opts,sizeof(opts));
    		   opts.fccHandler=mmioFOURCC('d','i','v','x');
    		   SetAviVideoCompression(avi,Image1->Picture->Bitmap->Handle,&opts,false,Form1->Handle);
    	   }
    
    AddAviFrame(avi,Image1->Picture->Bitmap->Handle);
    Label1->Caption=IntToStr(i);
    
    }
    CloseAvi(avi);
    }
    

    Die Bilder werden jetzt angezeigt, jedoch hat die Avi Datei 0kb
    Bei dem Beispiel aus dem Link hat es noch funktioniert.
    Werde mal ein bisschen weiter testen

    Aysel


Anmelden zum Antworten