Timer und Threads ruckeln für Fotoschwenk

Status
Nicht offen für weitere Antworten.

kamenz

Neues Mitglied
Hallo,

ich versuche in einem Foto einen Schwenk zu machen. Programmiert man dies mit einem Swing.Timer oder mit einem AWT.Timer ruckelt der Schwenk (auch wenn Hans Müller dies so empfiehlt http://java.sun.com/products/jfc/tsc/articles/timer/ ruckelt dies viel mehr als im Code unten).

Arbeitet man mit einem Thread, den man passend schlafen legt, klappt das noch schlechter. Die besten Ergebnisse erhält man s. u.. Hier muss nur der Pfad zu einem passenden Foto (muss größer als 2200x1700 Pixel sein) richtig eingestellt werden.

Hat jemand eine Idee, wie man den Schwenk noch besser hinbekommt. So ganz ruckelfrei ist das immer noch nicht und der Programmierstil ist ja auch nicht wirklich toll.

Besten Dank und Gruß
Karsten

Code:
package tests;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.swing.*;
import javax.imageio.ImageIO;

public class FilmExample3 {

    private static class ImagePanel extends JPanel {

        BufferedImage guiImage;
        BufferedImage imgA;
        int targetWidth = 1200;
        int targetHeight = 1000;
        Rectangle r0 = new Rectangle(0, 0, 1500, 1200);
        Rectangle r1 = new Rectangle(1000, 500, 1000, 800);
        JPanel mPanel = this;

        public Image getImage(String fileName) {
            try {
                File f = new File(fileName);
                if (f.exists()) {
                    return new ImageIcon(ImageIO.read(f)).getImage();
                } else {
                    return null;
                }
            } catch (IOException e) {
                e.printStackTrace();
                System.err.println("Fehler beim Laden des Images!");
                return null;
            }
        }

        ImagePanel(String file) {
            super(null);  // null layout manager
            imgA = (BufferedImage) getImage(file);
            setBackground(Color.black);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(targetWidth, targetHeight);
        }

        @Override
        public void paintComponent(Graphics g) {
            g.drawImage(guiImage, 0, 0, null);
        }
        int steps = 150;//slow = 400 midle = 250 fast=100
        int rate = 30;
        final Runnable paintImage = new Runnable() {

            public void run() {
                int i = 0;
                long t0 = System.nanoTime();
                guiImage = new BufferedImage(targetWidth, targetHeight,
                        BufferedImage.TYPE_INT_RGB);
                Graphics2D g2 = guiImage.createGraphics();
                g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                        RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);

                while (i <= steps) {
                    int sx1 = r0.x + (i * (r1.x - r0.x)) / steps;
                    int sy1 = r0.y + (i * (r1.y - r0.y)) / steps;
                    int sx2 = sx1 + r0.width + (i * (r1.width - r0.width)) / steps;
                    int sy2 = sy1 + r0.height + (i * (r1.height - r0.height)) / steps;
                    g2.drawImage(imgA, 0, 0, targetWidth, targetHeight, sx1, sy1, sx2, sy2, null); //doubleBuffer zeichnen
                    long tr = rate * 1000000 + t0;
                    while (System.nanoTime() < tr) {
                    }//warten bis rate msec vergangen sind
                    t0 = System.nanoTime();
                    mPanel.paint(mPanel.getGraphics());//statt repaint(), so nicht warten, wann Bild fertig ist
                    i++;
                }
                g2.dispose();

            }
        };

        public void startFade3() {
            Thread t = new Thread(paintImage);
            t.setPriority(Thread.MAX_PRIORITY);
            t.start();
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {

                final ImagePanel imagePanel = new ImagePanel("E:\\fotos\\zw\\myfoto2.jpg");

                Action fade3Action = new AbstractAction("WaitAction") {

                    public void actionPerformed(ActionEvent e) {
                        imagePanel.startFade3();
                    }
                };

                JToolBar toolbar = new JToolBar();
                toolbar.add(fade3Action);
                JFrame f = new JFrame("Timer/TimerTask Demo");
                WindowListener l = new WindowAdapter() {

                    @Override
                    public void windowClosing(WindowEvent e) {
                        System.exit(0);
                    }
                };
                f.addWindowListener(l);
                Container contentPane = f.getContentPane();
                contentPane.add(imagePanel, BorderLayout.CENTER);
                contentPane.add(toolbar, BorderLayout.NORTH);
                f.pack();
                f.setVisible(true);
            }
        });
    }
}
 

Wildcard

Top Contributor
Bleib doch einfch bei einem Bild und erhöhe den Scale Faktor. Die Position auf die du zoomst bestimmst du durch Graphics2D#translate.
Das busy waiting ersetzt du durch sleep und wenn du's ganz genau machen willst kannst du auf einen Schwellwert von sagen wir 5ms prüfen. Wenn du weniger als 5ms warten müsstest, mach ein yield draus.
Das Graphics Objekt ersetzt du durch ein repaint und gut.
Der Code reduziert sich um mindestens die Hälfte und es sollte flüssig genug sein.
 

Wildcard

Top Contributor
Beispiel mit ein paar fake Werten:

Code:
		@Override
		public void paintComponent(Graphics g) {
			Graphics2D g2d = (Graphics2D) g;
			g2d.translate(-1000 * scale, -1000 * scale);
			g2d.scale(scale, scale);
			g.drawImage(imgA, 0, 0, null);
		}

		int steps = 150;// slow = 400 midle = 250 fast=100
		int rate = 30;
		final Runnable paintImage = new Runnable() {

			public void run() {
				int i = 0;
				while (i <= steps) {

					scale += 0.003;
					mPanel.repaint();
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

					i++;
				}
				scale = 1.0;

			}
		};

		public void startFade3() {
			Thread t = new Thread(paintImage);
			t.start();
		}
	}
 

kamenz

Neues Mitglied
Besten Dank.. manchmal sieht man den Wald vor lauter Bäumen nicht.

Viel einfacher und kein ruckeln mehr- super.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Threads - Timer - run() mehrfach parallel? AWT, Swing, JavaFX & SWT 2
E JDialog mit count down timer AWT, Swing, JavaFX & SWT 1
M 2D-Grafik timer bei Analoguhr AWT, Swing, JavaFX & SWT 2
A Timer AWT, Swing, JavaFX & SWT 1
H Timer ohne alles lahmzulegen? AWT, Swing, JavaFX & SWT 2
O Timer in JOptionPane anzeigen AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing Timer in SwingWorker stoppen AWT, Swing, JavaFX & SWT 4
T Timer und GIF Animationen pausieren während Maus sich bewegt AWT, Swing, JavaFX & SWT 4
W Swing JLabel jede Sekunde aktualisieren, ohne Timer zu benutzen AWT, Swing, JavaFX & SWT 4
D Timer für Bildfolge in einem jLabel AWT, Swing, JavaFX & SWT 5
M Event Handling MousePressed vs. Timer! AWT, Swing, JavaFX & SWT 5
F Java Timer Bug? AWT, Swing, JavaFX & SWT 6
B Timer, TimerTask und Warten AWT, Swing, JavaFX & SWT 4
R Performance Drag and Drop & Timer AWT, Swing, JavaFX & SWT 3
E Problem mit Timer und Swing AWT, Swing, JavaFX & SWT 8
N AWT Timer überschreiben? AWT, Swing, JavaFX & SWT 8
P Label rotieren mit Timer AWT, Swing, JavaFX & SWT 5
F Swing GUI und Model mit Timer AWT, Swing, JavaFX & SWT 13
J Nach Timer ausführen AWT, Swing, JavaFX & SWT 6
S Timer oder Thread.sleep AWT, Swing, JavaFX & SWT 3
D Timer JFrame AWT, Swing, JavaFX & SWT 7
F Swing timer nimmt delay nicht an AWT, Swing, JavaFX & SWT 2
S Swing Timer, Countdown AWT, Swing, JavaFX & SWT 2
F Timer welches JPanel aktualisiert AWT, Swing, JavaFX & SWT 6
H Timer/Stoppuhr in MenuBar anzeigen AWT, Swing, JavaFX & SWT 4
D Applet Methode in Timer einbinden AWT, Swing, JavaFX & SWT 6
F Applet Applet starten...(+Timer?) AWT, Swing, JavaFX & SWT 12
R Probleme mit Swing Timer AWT, Swing, JavaFX & SWT 6
C Timer Problem AWT, Swing, JavaFX & SWT 5
VfL_Freak Swing kann ich einen laufenden Timer mitten in der Ausführung abbrechen? AWT, Swing, JavaFX & SWT 6
H Swing Timer Probleme AWT, Swing, JavaFX & SWT 5
Burny91 Swing Mit Timer JLabel updaten AWT, Swing, JavaFX & SWT 2
P Game of Life - PaintComponent-Problem / Timer? AWT, Swing, JavaFX & SWT 8
B JLabel mittels Timer und setLocation verschieben AWT, Swing, JavaFX & SWT 3
O Swing es können keine neuen Labels hinzufügt werden während der Timer läuft AWT, Swing, JavaFX & SWT 14
C Timer erstellen? AWT, Swing, JavaFX & SWT 2
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
L Timer Swing GUI AWT, Swing, JavaFX & SWT 2
G Swing Timer stoppen AWT, Swing, JavaFX & SWT 4
B Swing-Timer AWT, Swing, JavaFX & SWT 4
D javax.swing.Timer bringt NullPointerException AWT, Swing, JavaFX & SWT 4
J Swing timer? AWT, Swing, JavaFX & SWT 2
C Timer, Darstellung einer Uhr AWT, Swing, JavaFX & SWT 4
Z javax.swing.Timer: wie stoppen??? AWT, Swing, JavaFX & SWT 9
frager2345 Threads -> Ereignisbehandlung AWT, Swing, JavaFX & SWT 2
N jFrame löscht am Ende des Threads alles AWT, Swing, JavaFX & SWT 2
J GUI Ausgaben aus Threads AWT, Swing, JavaFX & SWT 13
A Swing ProgressBar über 2 parallel laufende Threads AWT, Swing, JavaFX & SWT 2
N JavaFX Logging des JavaFX Application Threads mit Log4J AWT, Swing, JavaFX & SWT 3
U JAVAFX observer und threads AWT, Swing, JavaFX & SWT 1
J Textlabel verändern mit parallelen Threads AWT, Swing, JavaFX & SWT 7
Sugan Inhalte mit Threads ändern -> java.lang.IllegalStateException AWT, Swing, JavaFX & SWT 6
R Straßenkreuzung - Ampeln mit Threads koordinieren AWT, Swing, JavaFX & SWT 5
C Threads Swing AWT, Swing, JavaFX & SWT 11
Z JavaFX Threads AWT, Swing, JavaFX & SWT 4
T hallo, habe ein Problem mit dem pro. eines Threads AWT, Swing, JavaFX & SWT 4
M Threads - nicht erklärbare Exception AWT, Swing, JavaFX & SWT 6
R Repaint() in Schleifen, Threads AWT, Swing, JavaFX & SWT 13
S Java Swing GUI mit MVC und Threads AWT, Swing, JavaFX & SWT 6
M Frage zu Threads AWT, Swing, JavaFX & SWT 3
C JTextArea scrollt bei append(String) aus Threads nicht ans Ende AWT, Swing, JavaFX & SWT 7
B GUI mit Threads aufbauen AWT, Swing, JavaFX & SWT 5
E Threads Ausgaben in GUI anzeigen lassen AWT, Swing, JavaFX & SWT 14
P JavaFX 2 (2.1 Beta) Threads AWT, Swing, JavaFX & SWT 7
B Threads in Swing AWT, Swing, JavaFX & SWT 4
M Problem mit Threads AWT, Swing, JavaFX & SWT 64
R Swing Java Swing Gui und nebenläufige Threads AWT, Swing, JavaFX & SWT 4
S Swing Threads Windows 7 64 bit AWT, Swing, JavaFX & SWT 12
J Threads + JFrame AWT, Swing, JavaFX & SWT 4
R Java threads und synchronized AWT, Swing, JavaFX & SWT 15
R Swing Swing und die Threads AWT, Swing, JavaFX & SWT 9
N Swing Threads sollen Tabtitel zur Laufzeit ändern AWT, Swing, JavaFX & SWT 4
S Gui und Aufgaben Threads AWT, Swing, JavaFX & SWT 12
M Zugriff paralleler Threads auf selbes JTextPane AWT, Swing, JavaFX & SWT 6
B Frage zu Swing,Threads, SwingWorker und Socket Communikation AWT, Swing, JavaFX & SWT 4
M Prioritäten bei SwingWorker / Threads AWT, Swing, JavaFX & SWT 9
B Swing GUI und Threads AWT, Swing, JavaFX & SWT 4
R Korrektes manipulieren der GUI aus anderen Threads heraus AWT, Swing, JavaFX & SWT 19
S Threads und Layout AWT, Swing, JavaFX & SWT 9
S Threads in einen Frame zeichnen lassen (Paint()?!) AWT, Swing, JavaFX & SWT 5
W GUI in mehreren Threads AWT, Swing, JavaFX & SWT 5
F Swing Anfängerproblem Threads AWT, Swing, JavaFX & SWT 6
S Swing Threads und das Ändern des Hintergrundes ... AWT, Swing, JavaFX & SWT 2
S Zeichnen in Threads AWT, Swing, JavaFX & SWT 4
T Auf Ende von mehreren Threads warten, ohne den EDT zu blockieren AWT, Swing, JavaFX & SWT 1
J SWT SWT und Threads AWT, Swing, JavaFX & SWT 5
borobudur SWT SWT-Framework und Threads AWT, Swing, JavaFX & SWT 12
W Threads nacheinander aufführen AWT, Swing, JavaFX & SWT 5
A Swing und Threads AWT, Swing, JavaFX & SWT 8
B JProgressbar wird nicht aktualisert, trotz Threads AWT, Swing, JavaFX & SWT 6
S JProgressBar und Threads AWT, Swing, JavaFX & SWT 11
G Probleme mit jList und Threads. AWT, Swing, JavaFX & SWT 3
R Swing & Threads AWT, Swing, JavaFX & SWT 4
R 2 Threads nacheinander. Einer terminiert, der andere nicht. AWT, Swing, JavaFX & SWT 9
J Unterschied zwischen SwingWorker und Threads AWT, Swing, JavaFX & SWT 4
P Threads und Swing bzw. AWT AWT, Swing, JavaFX & SWT 15
W Threads und trotzdem keine Nebenläufigkeit AWT, Swing, JavaFX & SWT 13
G Fenster erst nach Stoppen des Threads anzeigen AWT, Swing, JavaFX & SWT 3
N Threads kein neues Fenster erzeugen lassen AWT, Swing, JavaFX & SWT 4
G problem mit threads/repaint ! AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben