Performant mit MouseWheel zoomen

Status
Nicht offen für weitere Antworten.

cyliax

Mitglied
Ich habe jetzt hier schon ne Weile nach Lösungen gesucht meinen Zoom irgendwie zu beschleunigen, aber ich denke, ich habe grundsätzlich nen falschen Ansatz. Nehme mal an das Image jedesmal vom Panel zu löschen und wieder neu zu adden braucht einfach zu viel Zeit. Nun habe ich mit diese paintComponent und repaint Geschichten angesehen, aber das ist AWT oder? Und das soll man ja nicht mit Swing mischen?

Hier mal ein Code Ausschnitt:

Code:
	public void reScale(JPanel panel, Dimension dimension) {
		if (orgImage != null) {
			scaledDimension = dimension;
			panel.removeAll();
			Image image = orgImage.getScaledInstance(scaledDimension.width, scaledDimension.height, Image.SCALE_FAST);
			this.add(new JLabel(new ImageIcon(image)));
			panel.add(getComponent(0));
		}
	}

Angesteuert wird das ganze von:

Code:
		MouseWheelListener mouseWheelListener = new MouseWheelListener() {
			@Override
			public void mouseWheelMoved(MouseWheelEvent e) {
				if (myMediaFiles[1] != null) {
					if (e.getWheelRotation() < 0) {
						myMediaFiles[1].reScale(panel[1], new Dimension (myMediaFiles[1].getScaledDimension().width+2, myMediaFiles[1].getScaledDimension().height+2));
					}
					else {
						myMediaFiles[1].reScale(panel[1], new Dimension (myMediaFiles[1].getScaledDimension().width-2, myMediaFiles[1].getScaledDimension().height-2));
					}
				}
				panel[1].validate();
				panel[1].repaint();
			}
		};

Nehme an, da gibts ne ganz einfach Lösung, die ich bisher nur einfach übersehen habe. Danke euch schonmal.

PS: Was auch noch tool wäre, wenn die Qualitätseinstellung während des Skalierens auf FAST steht und dann nach ner halben Sekunde Nichtbenutzung des Scrollrades nochmal in SMOOTH gerendert wird.
 
Bei jeder Zoom-Stufe ein neues Bild zu erstellen ist ... :autsch:

Es wäre sicher schon um etliche Größenordnungen schneller, wenn du nur das Bild in der passenden Größe zeichnen würdest... grob sowas
Code:
class ImagePanel extends JPanel
{
    private Image fullSizeImage;

    private int zoomedWidth
    private int zoomedHeight;

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(fullSizeImage, 0,0, zoomedWidth, zoomedHeight, this);
    }

    public void setZoomedSize(int w, int h)
    {
        this.zoomedWidth = w;
        this.zoomedHeight = h;
        repaint();
    }

}

Schau auch mal hier: java.net: The Perils of Image.getScaledInstance() das was dort steht ("As an aside to the aside, in some rare cases I've even seen the following technique used in developers' code (this is an example of what not to do):" ist genau das was du gemacht hast 😀 )

Die Qualität umzustellen wäre dann (mit RenderingHints) recht leicht - das "verzögerte neuzeichnen mit hoher Qualität" kann man mit einem Thread erledigen.
 
danke dir, ich komme also nicht um dieses paintComponent drumherum. ich werde das so mal versuchen. danke für das kurze beispiel.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben