Frage

Ich brauche 101 Bitmaps aus dem Dateisystem laden (sie können nicht in die App als Ressource gebaut werden, da sie für jeden Durchlauf des Programms geändert werden) in eine Windows-Formular-Anwendung picturebox sequentiell basierend auf kurze Dauer Timer-Ereignissen (500ms geben oder nehmen).

Im Wesentlichen soll es wie eine langsame Animation arbeiten, aber es ist wichtig, dass jedes Bild angezeigt werden.

Ich habe eine einfache Anwendung in C # diese scheint es jedoch zu tun, aufgeraut, dass das Bild Laden und Anzeigen dauern länger als die 500ms so einige Bilder nie angezeigt werden.

Gibt es irgendeine Weise, die ich dies vermeiden kann? Preloading oder 101 PictureBox erstellen und zeigt und versteckt?

Wer irgendwelche Vorschläge?

War es hilfreich?

Lösung

Was nehmen am längsten? Bild Laden oder die Anzeige? Laden Sie jedes Bild, wenn es angezeigt wird benötigt? Ein Blick auf den Code wäre wirklich wertvoll.

Wenn Sie sicher sind, dass es immer genau 101 Bilder sein, laden sie alle in einer Reihe von System.Drawing.Bitmap zuerst dann eine Iteratorvariable haben, die bei jedem Aufruf des Tick Falle eines Timer erhöht wird . Lassen Sie sich diese Tick-Ereignis laden Sie das Bild aus dem Array in das PictureBox mit PictureBox.Image = myBitmapArray[iterator] Wenn Sie den Iterator ++i%=101; erhöhen Sie nicht ein OutOfBounds Fehler und die Animation Schleife bekommen.

Andere Tipps

Populate ein Array von Bitmap Objekten vor der Animation zu starten.

Ein paar Optionen ... wählen Sie eine oder kombinieren sie:

(1) Verwenden Sie ein Schloss und einen Zähler zu garantieren, dass, wenn das Ereignis ausgelöst wird es das nächste Bild in Zeile geladen werden.

(2) Deaktivieren Sie den Timer im Tick Ereignisse, dann wieder aktivieren, nachdem Sie das Bild geladen hat. Das Ergebnis ist, dass die Bilder ankommen 500ms nach dem letzten gezogen wird, so dass, wenn ein Bild eine Sekunde zur Last nimmt, werden die Bilder bei t gezogen = 1000 ms, t = 1500 ms, t = 3000 ms, usw. Alle Bilder gezeichnet werden, und 500ms ist garantiert zwischen den Bildern passieren, aber die Animation könnte so aussehen langsam.

(3) Führen Sie die oben, aber die Zeit, die Veranstaltung beginnt zu verfolgen, und nachdem das Bild gezogen wird, um den nächsten Timer-Tick eingestellt 500 zu sein - (jetzt - eventStart) ... so, dass, wenn das Bild nimmt 250ms zu remis, wird der nächste Timer-Tick in 250ms abzufeuern. Wenn jetzt - eventStart <0, sollte der nächste Timer-Tick sofort Feuer. Die Animation wird die minimale Menge an Zeit möglich machen, aber Bilder könnten möglicherweise blinken durch, nur für wenige Millisekunden erscheinen.

(4) Verwenden PictureBox.LoadAsync() Ihnen einig Multi-Threading geben ... das nächste Ereignis kann das Bild geladen, während die Vorveranstaltung Zeichnung wird. Aber Sie werden eine Mutex müssen, dass Sie in dem LoadCompleted Ereignisse freigeben, dass Sie auf warten vor dem Aufruf LoadAsync (), wenn Sie die Bilder garantieren, müssen alle gezogen.

(5) Ich bin mir nicht sicher, ob die Zeichnung des Bildes fällt unter die Kategorie Layout, aber man kann versuchen SuspendLayout() und ResumeLayout() vor / Aufruf nach dem Laden des Bildes

(6) Verwenden Sie eine Reihe von Bildern, sperren einen Zähler, und verwenden Sie die .Image Eigenschaft des PictureBox Sie vorab laden, um die Bilder zu lassen. Ich glaube, dies wurde in einer anderen Antwort vorgeschlagen, auch

HTH,
James

Ich habe keine konkrete Antwort für Sie, aber ich würde diesen Ansatz, indem zuerst bestimmt wird, ob es das Laden von Bildern, Bildanzeige, oder beiden Aktionen, die zu viel Zeit nehmen.

Ich könnte mir vorstellen, dass die Bildlade geht relativ schnell sein, auch mit recht großen Bildgrößen, vorausgesetzt, dass die Bilder lokal sind, und Sie haben relativ anständige Hardware. Mein erster Versuch bedeuten würde alle Bilder aus einem Thread Laden nacheinander, so dass Sie Anwendung muss nicht vor den nächsten Bild Lasten vollständig für die Bildanzeige warten.

Wenn die Bildanzeige wird eine lange Zeit (und sogar auf meine wirklich leistungsstarke Workstation es ist nicht alles schnell, dass für große Bilder), dann ist es Ihnen möglich, die Bilder vor der Anwendung zeigt alles zu skalieren? Ist Ihre Anwendung mit voller Auflösung Bildern beschäftigen müssen? Mit den Megapixel-Kameras in diesen Tagen, kann ich nicht Bild, das man sich wünschen kann alle Daten, die in den Bilddateien sowieso haben, da die Größen leicht Monitorauflösungen um einen Faktor von 6 überschreiten kann.

Eine andere Sache, die ein Anliegen sein kann, ist die Größe der Bilder. Wenn das alle 18 Megapixel Bilder, kann ich sehen, es zu nehmen entweder viel Zeit oder viel Platz.

Sie möchten können sie auf die Größe Ihrer Anzeigebereich, um die Größe, wenn Sie sie zunächst so laden, dass Sie nicht verwenden, 2 GB RAM oder warten, um die Scheibe abzulesen, je nachdem, wie Sie es umsetzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top