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
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);
}
});
}
}