AffineTransformApp.java Source code

Java tutorial

Introduction

Here is the source code for AffineTransformApp.java

Source

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class AffineTransformApp extends JFrame {
    DisplayPanel displayPanel;

    JComboBox scaleXval, scaleYval, shearXval, shearYval;

    String[] scaleValues = { "0.10", "0.25", "0.50", "0.75", "1.00", "1.25", "1.50", "1.75", "2.00" };

    String[] shearValues = { "0.00", "0.25", "0.50", "0.75", "1.00" };

    public AffineTransformApp() {
        super();
        Container container = getContentPane();

        displayPanel = new DisplayPanel();
        container.add(displayPanel);

        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(2, 4, 5, 5));
        scaleXval = new JComboBox(scaleValues);
        scaleXval.setSelectedItem("1.00");
        scaleXval.addActionListener(new ComboBoxListener());
        scaleYval = new JComboBox(scaleValues);
        scaleYval.setSelectedItem("1.00");
        scaleYval.addActionListener(new ComboBoxListener());

        shearXval = new JComboBox(shearValues);
        shearXval.setSelectedItem("0.00");
        shearXval.addActionListener(new ComboBoxListener());
        shearYval = new JComboBox(shearValues);
        shearYval.setSelectedItem("0.00");
        shearYval.addActionListener(new ComboBoxListener());

        panel.add(new JLabel("Scale X value:"));
        panel.add(scaleXval);
        panel.add(new JLabel("Scale Y value:"));
        panel.add(scaleYval);
        panel.add(new JLabel("Shear X value:"));
        panel.add(shearXval);
        panel.add(new JLabel("Shear Y value:"));
        panel.add(shearYval);

        container.add(BorderLayout.SOUTH, panel);

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        setSize(displayPanel.getWidth(), displayPanel.getHeight() + 10);
        setVisible(true);
    }

    public static void main(String arg[]) {
        new AffineTransformApp();
    }

    class ComboBoxListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            JComboBox temp = (JComboBox) e.getSource();

            if (temp == scaleXval) {
                displayPanel.scalex = Double.parseDouble((String) temp.getSelectedItem());
                displayPanel.applyValue(true, false);
                displayPanel.applyFilter();
                displayPanel.repaint();
            } else if (temp == scaleYval) {
                displayPanel.scaley = Double.parseDouble((String) temp.getSelectedItem());
                displayPanel.applyValue(true, false);
                displayPanel.applyFilter();
                displayPanel.repaint();
            } else if (temp == shearXval) {
                displayPanel.shearx = Double.parseDouble((String) temp.getSelectedItem());
                displayPanel.applyValue(false, true);
                displayPanel.applyFilter();
                displayPanel.repaint();
            } else if (temp == shearYval) {
                displayPanel.sheary = Double.parseDouble((String) temp.getSelectedItem());
                displayPanel.applyValue(false, true);
                displayPanel.applyFilter();
                displayPanel.repaint();
            }
        }
    }
}

class DisplayPanel extends JLabel {
    Image displayImage;

    BufferedImage biSrc, biDest;

    BufferedImage bi;

    Graphics2D big;

    AffineTransform transform;

    double scalex = 1.0;

    double scaley = 1.0;

    double shearx = 1.0;

    double sheary = 1.0;

    DisplayPanel() {
        setBackground(Color.black);
        loadImage();
        setSize(displayImage.getWidth(this), displayImage.getWidth(this)); // panel
        createBufferedImages();

        transform = new AffineTransform();
    }

    public void loadImage() {
        displayImage = Toolkit.getDefaultToolkit().getImage("largeJava2sLogo.jpg");
        MediaTracker mt = new MediaTracker(this);
        mt.addImage(displayImage, 1);
        try {
            mt.waitForAll();
        } catch (Exception e) {
            System.out.println("Exception while loading.");
        }

        if (displayImage.getWidth(this) == -1) {
            System.out.println(" Missing .jpg file");
            System.exit(0);
        }
    }

    public void createBufferedImages() {
        biSrc = new BufferedImage(displayImage.getWidth(this), displayImage.getHeight(this),
                BufferedImage.TYPE_INT_RGB);

        big = biSrc.createGraphics();
        big.drawImage(displayImage, 0, 0, this);

        bi = biSrc;

        biDest = new BufferedImage(displayImage.getWidth(this), displayImage.getHeight(this),
                BufferedImage.TYPE_INT_RGB);
    }

    public void applyValue(boolean scale, boolean shear) {
        if (scale) {
            transform.setToScale(scalex, scaley);
            scale = false;
        } else if (shear) {
            transform.setToShear(shearx, sheary);
            shear = false;
        }
    }

    public void applyFilter() {
        AffineTransformOp op = new AffineTransformOp(transform, null);
        Graphics2D biDestG2D = biDest.createGraphics();
        biDestG2D.clearRect(0, 0, biDest.getWidth(this), biDest.getHeight(this));
        op.filter(biSrc, biDest);
        bi = biDest;
    }

    public void reset() {
        big.setColor(Color.black);
        big.clearRect(0, 0, bi.getWidth(this), bi.getHeight(this));
        big.drawImage(displayImage, 0, 0, this);
    }

    public void update(Graphics g) {
        g.clearRect(0, 0, getWidth(), getHeight());
        paintComponent(g);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2D = (Graphics2D) g;
        g2D.drawImage(bi, 0, 0, this);
    }
}