Image Zeilenweise zeichnen

meckiebro

Mitglied
Hallo zusammen,
Ich möchte ein Image aus einer URL schon während des ladens zeichnen. Also bspw. das es Zeilenweise gezeichnet wird. Bisher haben alle ansätze die ich hatte erst gewartet bis das Bild komplett geladen wurde und es erst dann gezeichnet.

Weiß einer wie das geht?
 
Du kannst versuchen, ob du das halb geladene Bild bereits zeichnen kannst. Das wird zwar wahrscheinlich eine Exception werfen (weil die Datei "defekt" ist), aber die kannst du ja abfangen.

Vorraussetzung ist, dass du die Datei in einem anderen Thread lädtst (was du sowieso immer machen solltest ;). Dann müsstest du nur von diesem Thread aus regelmäßig (oder jedesmal wenn ein Stück der Datei geladen wird) das Bild neu Zeichnen (indem du repaint() aufrufst).

So würde ich das machen – hab es aber noch nicht probiert.

EDIT: Graphics kann – laut JavaDoc – auch unvollständige Bilder zeichnen, siehe http://download.oracle.com/javase/6...mage, int, int, java.awt.image.ImageObserver)
 
Zuletzt bearbeitet:
Hmm mein Problem ist bisher eigentlich mehr das bei bspw.
Code:
ImageIcon img = new ImageIcon(new URL("..."));

img die ganze Zeit null ist erst wenn das Bild fertig ist dann ist es auch initialisiert.
Ich weiß nicht wie ich dazwischen greifen soll.
 
Stimmt. Dann must du dir wohl deinen eigenen Reader bauen...
Und das ist alles andere als einfach. Ich lad mir mal den Source code vom OpenJDK runter.

btw.: wofür brauchst du so etwas? Baust du dir einen Browser?
 
Zuletzt bearbeitet:
Nein mein Programm lädt Bilder von thetvdb.com runter und die Seite ist nicht die schnellste. Einige Bilder brauchen echt lange. Habe aber gerade gesehen das es zu jedem Bild auch ein thumbnail gibt die gehen um einiges schneller. Werde darauf erst einmal zurückgreifen.
Wäre aber dennoch interessant ob das gehen würde. Das erspart bspw. eine Progressbar oder so. Da kann der Benutzer nämlich direkt sehen das geladen wird.
 
Also mir fällt spontan noch ne Möglichkeit ein: Du lädtst das Bild (von einem anderen Thread aus) in einen Puffer (zur Not eine temporäre Datei auf der Festplatte). Von dort aus kannst du dann das Bild laden.
Das Problem dabei ist nur, dass der Code hinter
Java:
ImageIcon img = new ImageIcon(new URL("..."))
dir möglicherweise kein Bild zurückgibt, sondern eine Exception wirft.
 
Howdie.

Ich glaube, dein Hauptproblem ist, dass du ein ImageIcon verwendest, das erschwert dir hier einiges. Zumindest könnte ich mir vorstellen, dass ImageIcon irgendwelche Überprüfungen auf das Bild ausführt (Hash, etc).
An deiner Stelle würde ich mir eine eigene Komponente bauen, die in ihrer paintComponent(Graphics g) (falls du Swing verwendest) den Inhalt eines BufferedImage in das Graphics-Objekt zeichnet. In diesen Bildpuffer würde ich mit oben genannten Methoden ein Bild aus dem Netz laden. Dann kannst du in dem Bild-Lade-Thread zyklisch die repaint()-Methode der Komponente aufrufen, bis das Bild vollständig ist. So würde ich es jedenfalls machen bzw. mal testen.

Gruß
miffi
 
Zuletzt bearbeitet:
Zurück