Bilder skaliert zeichnen

Status
Nicht offen für weitere Antworten.

actimel

Mitglied
Hi,
gibt es in java eine methode um bilder von z.B. 25 pixeln auf 30 pixel automatisch vergrößern zu lassen? zur zeit habe ich .png bilder ich könnte sie aber auch anders bekommen 🙂 danke
 
Zuletzt bearbeitet von einem Moderator:
Was willst Du mit den Bildern machen? In anderer Größe in einem Java-Programm darstellen, oder sie vergrößern und wieder abspeichern? Erster Fall ist trivial, der zweite ist möglich aber nicht trivial, da man beim Abspeichern der Bilder natürlich vieles beachten muss (zum Beispiel der Verlust durch erneute Kompression von JPEGs).

Ebenius
 
danke erstma für die schnelle antwort.
Ich möchte sie lediglich in unterschiedlichen größen zeichnen.
da sich mein JFrame automatisch an die bildschirmauflösung anpasst, müssen auch meine bilder mitvergrößert/verkleinert werden.

gruß linus
 
ja danke problem behoben.
einzige frage ist noch ob wann die bildschirmauflösung irgendwie beobachten kann.
also wie ein observable.
bedeutet: wenn jemand die bildschirmauflösung ändert bekomm ich das mit und kann einfach anpassen.
das ist einfach wenn ich bei jedem paint die größe abfrage aber von der perfomance her vll. nicht ganz elegant
 
Der performance impact für skalieren ist übrigens gewaltig. Wo immer du die Möglichkeit hast, würde ich empfehlen die Bilder gleich in der richtigen Größe auszuliefern, auch wenn sie sich dadurch duplizieren.
Wenn das nicht geht, merk dir im Speicher die skalierte Version und skaliere nicht bei jedem Zeichnen.
 
Der performance impact für skalieren ist übrigens gewaltig. Wo immer du die Möglichkeit hast, würde ich empfehlen die Bilder gleich in der richtigen Größe auszuliefern, auch wenn sie sich dadurch duplizieren.
Wenn das nicht geht, merk dir im Speicher die skalierte Version und skaliere nicht bei jedem Zeichnen.
An dieser Stelle weise ich allerdings auf meine Signatur hin. Wenn es um ein einfaches Hintergrundbild in einem JPanel geht und das Programm ansonsten kaum anforderungen hat, würde ich das Bild einfach skaliert zeichnen. Kannst ja einen Kommentar an die Stelle machen, dass dort Optimierungsmöglichkeiten bestehen...

Ebenius
 
Wie oft wird repaint aufgerufen? Zieh mal ein anderes Fenster über deine Java App. Das triggert hunderte paint Events und dann willst du ein großes Hintergrund Bild jedes mal on-the-fly skalieren? Ein 800x600 Bild zB hat schon mehr als 1 MiB an Daten darauf werden je nach scaling Strategy komplexe und aufwendige Algorithmen losgelassen.
Ich bin genauso sehr gegen sinnlos Optimierungen wie du, aber das ist schon extrem extrem teuer.
 
Zuletzt bearbeitet:
Wildcard, hast Du schon mal was von Double-buffering gehört? Das ist vollkomment unnötig das Bild zu cache-n. Probier's aus:

[HIGHLIGHT="Java"]public static void main(String[] args) {
final JFrame f = new JFrame("Schlumpf");
f.setContentPane(new JLabel("Ich werde nur neu gezeichnet, "
+ "wenn ich die Größe verändere") {

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("painting...");
}
});
f.setSize(600, 200);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);
}[/HIGHLIGHT]

Nachtrag: Bei restore nach iconify wird noch neu gezeichnet, aber das ist vertretbar.

Ebenius
 
Gleich mal mit Quelle dazu, damit du mir auch glaubst das es sich um ein Java 6 only behaviour handelt 😉
Double buffering enhancements

Currently, there can be a noticable delay between the time a window is unobscured and the time the window is repainted.

In Java SE 6, Swing provides full double buffering. For each window, Java SE 6 maintains an offscreen buffer that remains in sync with the onscreen window buffer. Any time a window is unobscured, Swing copies from the back buffer directly to the screen. Swing also manages repainting for JWindow, JDialog, JApplet, JFrame and other heavyweight components in the Swing package. New methods have been added to RepaintManager to manage this activity.

Applications which can rely on Swing to do painting on an expose event can be affected. In Java SE 6, Swing classes might not paint an expose event if they can instead refresh the screen from the backbuffer.
Java SE 6 Compatibility
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben