ImageIO, Bilderordner durchblättern

muckelzwerg

Bekanntes Mitglied
Hiho, ich habe hier eine Oberfläche zum Anzeigen und Durchblättern von Bildern.
Die Bilder sind eigentlich Nebensache und werden bei Programmstart in ein Feld mit BufferedImages geladen und daraus dann gezeichnet.
Soweit alles gut. Leider ist das fürs Durchblättern von Ordnern mit vielen Bildern zu speicherbedürftig, es wäre aber doch ganz schön, wenn das ginge.
Gibts dafür ein "Standardverfahren", dass mir grad mal jemand an den Kopf werfen kann?

So frei aus der Hüfte, würde ich jetzt ein Feld für z.B. 10 Bilder als Cache anlegen und dann beim Blättern jeweils eins rauswerfen und ein neues reinladen.
Fürs Laden dann einen zusätzlichen Thread, damit die Anwendung in der Zeit nicht blockiert.

Gibts da schon was, überseh ich was, sonst noch was ...?
 

XHelp

Top Contributor
Wozu willst du überhaupt bilder vorladen? Entweder hast du 20000 mb große Bilder, die du eh nicht im Speicher halten kannst, oder das laden müsste ohne hin zügig gehen.
Wenn du dennoch es vorladen willst, dann kannst du dir so ein Feld auch schnell selber zusammenbasteln. Stichwort wäre da wohl "modulo".
 

muckelzwerg

Bekanntes Mitglied
Vielleicht verstehen wir unter "zügig" etwas anderes. Das sind Jpegs und die brauchen mit dem Reader aus ImageIO gerne mal 50ms bis 100ms für Größen bis 500k
Das ist zum Durchschalten und anschauen vielleicht genug. Aber die Bilder werden bewegt und "eingeblendet", da kommt ich mit der Ladegeschwindigkeit nicht mehr aus, sondern muss im Voraus laden.

Was meinst Du mit "modulo"?
 

XHelp

Top Contributor
Du wirst ja wohl nicht jedes mal beim Bewegen das Bild neuladen... wie dem auch sei, mit modulo meinte ich sowas wie:
Java:
public class CircleArray<E> {
	private Object[] values;
	private int pointer;
	private int storredCount;

	public CircleArray(int length) {
		values = new Object[length];
		pointer = 0;
		storredCount = 0;
	}

	public void add(E value) {
		pointer = (pointer + 1) % values.length;
		values[pointer] = value;
		if (storredCount < values.length) {
			storredCount++;
		}
	}

	public E get(int i) {
		return (E) values[((pointer - i) + values.length) % values.length];
	}

	public int getCapacity() {
		return values.length;
	}

	public String toString() {
		String s = "[";
		for (int i = 0; i < storredCount; i++) {
			s += get(i) + ",";
		}
		if (s.endsWith(",")) {
			s = s.substring(0, s.length() - 1);
		}
		s += "]";
		return s;
	}

	public static void main(String[] args) {
		CircleArray<Integer> test = new CircleArray<Integer>(5);
		for (int i = 0; i < 10; i++) {
			test.add(i);
			System.out.println(test);
		}
		System.out.println("Jetzt sollte das Array 9,8,7,6,5 enthalten:");
		System.out.println(test);
		test.add(20);
		System.out.println("Jetzt sollte es 20,9,8,7,6 sein:");
		System.out.println(test);
	}
}
 
Zuletzt bearbeitet:

muckelzwerg

Bekanntes Mitglied
Nein, natürlich lade ich das Bild nicht bei jedem Bewegen neu.
Also doch mal etwas konkreter. Stell Dir eine "Fischaugenansicht" vor. In der Mitte ein groß dargestelltes Bild.
Links und rechts daneben Vorschaubilder des vorhergehenden und nachfolgenden Bildes.
Eine Stimme aus dem Off schreit "Thumbnails". Die lassen sich dort jedoch nicht gut einsetzen.
Beim Umschalten der Bilder wird das aktuelle Bild z.B. nach links bewegt. Dabei "fährt" es auf die Position des linken Vorschaubildes (oder "Nachschaubildes") und wird auf dessen Größe skaliert.
Umgekehrt wird das bisherige Vorschaubild in die Mitte geschoben und dabei auf die volle Größe aufgezogen.
Ein weiteres Vorschaubild rutscht in diesem Fall auf der rechten Seite nach.
Als Metapher kann man sich vorstellen, einen Filmstreifen mit einem Vergrößerungsglas zu betrachten.

Es sind jederzeit drei Bilder zu sehen, die wegen den Transitionen nur schwer als Thumbnails verwendet werden können.
Außerdem muss mindestens ein viertes Bild geladen sein, das in der Liste nachrückt, wenn geblättert wird.
Lädt man das neue Bild, genau in dem Moment, wo man weiterblättert machen 50ms Wartezeit die komplette Darstellung kaputt.
Noch schlimmer wird es, wenn man mit Trägheit arbeitet und den Filmstreifen mit Schwung "anwirft". Dann hat man nichtmal mehr eine anständige Betrachtungszeit, in der man weitere Bilder nachladen kann. Dementsprechend muss der Bildercache dann wachsen, um wenigstens einigermaßen kompensieren zu können. (100% lösen kann man das Problem nicht)


Danke für den Code, aber mir ging es eigentlich weniger um einen Ringpuffer, als um die "Cache-Eigenschaften". Ich dachte sowas hätte vielleicht schonmal wer geschrieben.
Ist alles etwas fummelig, weil die Bilder links und rechts nachgeladen werden und es noch ein paar blöde Sonderfälle gibt. Z.B. wenn man das Ende der Liste erreicht. ("modulo" zu verwenden und einfach von vorne anzufangen wäre eine Option. Eigentlich soll das Album aber dort enden.)
 

Ähnliche Java Themen

Neue Themen


Oben