import java.awt.*;
import javax.swing.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.awt.event.*;

public class ReadImage extends JPanel implements ActionListener {
    Image image;
    javax.swing.Timer timer;
    double theta = 0;
    double dtheta = 0.05;
    double scale = 1;
    ReadImage(Image im) {
	setBackground(Color.black);
	image = im;
	timer = new Timer(20, this);
    }

    public void paintComponent(Graphics gfx) {
	super.paintComponent(gfx);
	Graphics2D g = (Graphics2D) gfx;
	AffineTransform at = new AffineTransform();
	int width = image.getWidth(this);
	int height = image.getHeight(this);

	AffineTransform transform = new AffineTransform();
	transform.translate(150 - width/2, 150 - height/2);
	at.scale(scale, scale);
	at.rotate(theta);
	g.setTransform(transform);

	at = AffineTransform.getRotateInstance(theta, width/2, height/2);
	at.scale(scale, scale);
	g.drawImage(image, at, this);
    }

    public void actionPerformed(ActionEvent event) {
	theta += dtheta;
	scale = 1+0.5*Math.sin(theta);
	repaint();
    }

    public void start() {
	if (!timer.isRunning()) timer.start();
    }

    public void stop() {
	if (timer.isRunning()) timer.stop();
    }
    
    static ReadImage ri;
    public static void main(String[] args) {
	Image image = new javax.swing.ImageIcon("pix.gif").getImage();
	//	Image image = Toolkit.getDefaultToolkit().getImage("pix.gif");
	ri = new ReadImage(image);
	ri.setPreferredSize(new Dimension(300, 300));
	
	JFrame frame = new JFrame("ReadImage");
	frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	frame.getContentPane().add(ri, BorderLayout.CENTER);
	frame.pack();
	frame.setVisible(true);

	JPanel buttonPanel = new JPanel();
	JButton start = new JButton("Start");
	JButton stop = new JButton("Stop");
	buttonPanel.add(start);
	buttonPanel.add(stop);
	frame.getContentPane().add(buttonPanel, BorderLayout.SOUTH);

	start.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent ae) {
		    ri.start();
		}
	    });
	stop.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent ae) {
		    ri.stop();
		}
	    });
				
    }
}
