Skip to content

Instantly share code, notes, and snippets.

@vineetrok
Created October 11, 2012 13:14
Show Gist options
  • Save vineetrok/3872189 to your computer and use it in GitHub Desktop.
Save vineetrok/3872189 to your computer and use it in GitHub Desktop.
GUI program which performs Shear , Scale, Translate and Rotate affineTransforms on an image
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package assignment11;
import images.*;
import assignment11.ImagePreviewPanel;
import java.awt.Graphics;
import java.awt.Window;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
/**
*
* @author Vineetrok
*/
public class AffineTransformGUI extends javax.swing.JFrame {
BufferedImage mainImage, copyOfMainImage, transformedImage, blackImage, backupImage;
double transX, transY, theta, rotateX, rotateY, shearX, shearY,scaleX,scaleY;
int imageWidth, imageHeight;
String selection = "Select Transition";
/**
* Creates new form AffineTransformGUI
*/
public AffineTransformGUI() {
initComponents();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
FileChooser = new javax.swing.JFileChooser();
mainPanel = new javax.swing.JPanel();
ResetBtn = new javax.swing.JButton();
XSlider = new javax.swing.JSlider();
ClearBtn = new javax.swing.JButton();
ExitBtn = new javax.swing.JButton();
YSlider = new javax.swing.JSlider();
TransformationList = new javax.swing.JComboBox();
displayLabel = new javax.swing.JLabel();
jMenuBar1 = new javax.swing.JMenuBar();
FileMenu = new javax.swing.JMenu();
Open = new javax.swing.JMenuItem();
Save = new javax.swing.JMenuItem();
AboutMe = new javax.swing.JMenu();
ImagePreviewPanel preview = new ImagePreviewPanel();
FileChooser.setAccessory(preview);
FileChooser.addPropertyChangeListener(preview);
FileChooser.setCurrentDirectory(new java.io.File("D:\\M.Sc.I.T\\standard_test_images\\standard_test_images"));
FileChooser.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
FileChooserActionPerformed(evt);
}
});
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Affine Transforms Demo");
setResizable(false);
mainPanel.setBackground(new java.awt.Color(51, 51, 51));
mainPanel.setPreferredSize(new java.awt.Dimension(300, 300));
ResetBtn.setFont(new java.awt.Font("Gotham Medium", 0, 14)); // NOI18N
ResetBtn.setText("RESET");
ResetBtn.setPreferredSize(new java.awt.Dimension(80, 20));
ResetBtn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
ResetBtnActionPerformed(evt);
}
});
XSlider.setBackground(new java.awt.Color(51, 51, 51));
XSlider.setForeground(new java.awt.Color(255, 255, 255));
XSlider.setPaintLabels(true);
XSlider.setPaintTicks(true);
XSlider.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
XSliderStateChanged(evt);
}
});
ClearBtn.setFont(new java.awt.Font("Gotham Medium", 0, 14)); // NOI18N
ClearBtn.setText("CLEAR");
ClearBtn.setPreferredSize(new java.awt.Dimension(80, 20));
ClearBtn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
ClearBtnActionPerformed(evt);
}
});
ExitBtn.setFont(new java.awt.Font("Gotham Medium", 0, 14)); // NOI18N
ExitBtn.setText("EXIT");
ExitBtn.setPreferredSize(new java.awt.Dimension(80, 20));
ExitBtn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
ExitBtnActionPerformed(evt);
}
});
YSlider.setBackground(new java.awt.Color(51, 51, 51));
YSlider.setForeground(new java.awt.Color(255, 255, 255));
YSlider.setOrientation(javax.swing.JSlider.VERTICAL);
YSlider.setPaintLabels(true);
YSlider.setPaintTicks(true);
YSlider.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
YSliderStateChanged(evt);
}
});
TransformationList.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Select Transition", "Translation", "Shear", "Rotate", "Scale" }));
TransformationList.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
TransformationListActionPerformed(evt);
}
});
displayLabel.setBackground(new java.awt.Color(204, 204, 204));
displayLabel.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
displayLabel.setIconTextGap(0);
displayLabel.setMaximumSize(new java.awt.Dimension(300, 300));
javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
mainPanel.setLayout(mainPanelLayout);
mainPanelLayout.setHorizontalGroup(
mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(mainPanelLayout.createSequentialGroup()
.addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(mainPanelLayout.createSequentialGroup()
.addGap(32, 32, 32)
.addComponent(TransformationList, javax.swing.GroupLayout.PREFERRED_SIZE, 206, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(ResetBtn, javax.swing.GroupLayout.DEFAULT_SIZE, 84, Short.MAX_VALUE)
.addComponent(ClearBtn, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(ExitBtn, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
.addGroup(mainPanelLayout.createSequentialGroup()
.addGap(24, 24, 24)
.addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(mainPanelLayout.createSequentialGroup()
.addComponent(XSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 0, Short.MAX_VALUE))
.addGroup(mainPanelLayout.createSequentialGroup()
.addComponent(displayLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(YSlider, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))))
.addContainerGap(18, javax.swing.GroupLayout.PREFERRED_SIZE))
);
mainPanelLayout.setVerticalGroup(
mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup()
.addGap(49, 49, 49)
.addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(YSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(displayLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(XSlider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 13, Short.MAX_VALUE)
.addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(ResetBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(TransformationList, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(13, 13, 13)
.addComponent(ClearBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(ExitBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(45, 45, 45))
);
jMenuBar1.setBorder(null);
FileMenu.setMnemonic('F');
FileMenu.setText("File");
FileMenu.setFont(new java.awt.Font("Gotham Medium", 0, 11)); // NOI18N
Open.setFont(new java.awt.Font("Gotham Medium", 0, 11)); // NOI18N
Open.setMnemonic('O');
Open.setText("Open");
Open.setOpaque(false);
Open.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
OpenActionPerformed(evt);
}
});
FileMenu.add(Open);
Save.setText("Save");
Save.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
SaveActionPerformed(evt);
}
});
FileMenu.add(Save);
jMenuBar1.add(FileMenu);
AboutMe.setText("About Me");
AboutMe.setFont(new java.awt.Font("Gotham Medium", 0, 11)); // NOI18N
jMenuBar1.add(AboutMe);
setJMenuBar(jMenuBar1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(mainPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 403, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(mainPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 549, javax.swing.GroupLayout.PREFERRED_SIZE)
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void ResetBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ResetBtnActionPerformed
// TODO add your handling code here:
if (backupImage != null) {
paintImage(backupImage);
}
}//GEN-LAST:event_ResetBtnActionPerformed
private void ClearBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ClearBtnActionPerformed
// TODO add your handling code here:
paintImage(blackImage);
}//GEN-LAST:event_ClearBtnActionPerformed
private void ExitBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ExitBtnActionPerformed
// TODO add your handling code here:
System.exit(0);
}//GEN-LAST:event_ExitBtnActionPerformed
private void OpenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_OpenActionPerformed
// TODO add your handling code here:
int returnVal = FileChooser.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = FileChooser.getSelectedFile();
try {
backupImage = mainImage = ImageIO.read(file);
} catch (IOException ex) {
Logger.getLogger(AffineTransformGUI.class.getName()).log(Level.SEVERE, null, ex);
}
transformedImage = new BufferedImage(displayLabel.getWidth(), displayLabel.getHeight(), BufferedImage.TYPE_INT_RGB);
blackImage = new BufferedImage(displayLabel.getWidth(), displayLabel.getHeight(), BufferedImage.TYPE_INT_RGB);
blackImage.setRGB(51, 51, 51);
paintImage(mainImage);
} else {
System.out.println("File access cancelled by user.");
}
}//GEN-LAST:event_OpenActionPerformed
private void FileChooserActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_FileChooserActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_FileChooserActionPerformed
private void TransformationListActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_TransformationListActionPerformed
// TODO add your handling code here:
selection = (String) TransformationList.getSelectedItem();
System.out.println(selection);
if (selection == "Scale") {
if(YSlider.isEnabled()==false){
YSlider.setEnabled(true);
}
XSlider.setMaximum(20);
XSlider.setMinimum(1);
YSlider.setMaximum(20);
YSlider.setMinimum(1);
XSlider.setValue(1);
YSlider.setValue(1);
} else if (selection == "Rotate") {
YSlider.setEnabled(false);
XSlider.setMaximum(360);
XSlider.setMinimum(0);
XSlider.setValue(0);
} else if (selection == "Translation") {
YSlider.setEnabled(true);
XSlider.setMaximum(300);
XSlider.setMinimum(-300);
YSlider.setMaximum(300);
YSlider.setMinimum(-300);
XSlider.setMajorTickSpacing(0);
YSlider.setValue(0);
} else if (selection == "Shear") {
YSlider.setEnabled(true);
XSlider.setMaximum(5000);
XSlider.setMinimum(0);
YSlider.setMaximum(5000);
YSlider.setMinimum(0);
}
}//GEN-LAST:event_TransformationListActionPerformed
private void XSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_XSliderStateChanged
// TODO add your handling code here:
if (selection == "Translation") {
transX = XSlider.getValue();
translateFunction(transY, transY);
} else if (selection == "Rotate") {
theta = XSlider.getValue();
theta = Math.toRadians(theta);
rotateFunction(theta);
} else if (selection == "Shear") {
shearX = XSlider.getValue();
shearFunction(shearX, shearY);
} else if (selection == "Scale") {
scaleX= XSlider.getValue();
scaleFunction(scaleX/10, scaleY/10);
}
}//GEN-LAST:event_XSliderStateChanged
private void YSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_YSliderStateChanged
// TODO add your handling code here:
if (selection == "Translation") {
transY = YSlider.getValue();
translateFunction(transX, transY);
} else if (selection == "Shear") {
shearY = YSlider.getValue();
shearFunction(shearX, shearY);
} else if (selection == "Scale") {
scaleY= YSlider.getValue();
scaleFunction(scaleX/10, scaleY/10);
}
}//GEN-LAST:event_YSliderStateChanged
private void SaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SaveActionPerformed
// TODO add your handling code here:
Graphics saveImage = transformedImage.getGraphics();
BufferedImage saveBufferedImage = new BufferedImage(displayLabel.getHeight(), displayLabel.getWidth(), BufferedImage.TYPE_INT_ARGB);
saveImage.drawImage(saveBufferedImage, 0, 0, null);
File f = new File("AffineTransformedImage.png");
try {
ImageIO.write(saveBufferedImage,"PNG" , f);
} catch (IOException ex) {
Logger.getLogger(AffineTransformGUI.class.getName()).log(Level.SEVERE, null, ex);
}
}//GEN-LAST:event_SaveActionPerformed
public void scaleFunction(double scaleX,double scaleY){
try{
AffineTransform tx = AffineTransform.getScaleInstance(scaleX, scaleY);
// tx.scale(scaleX, scaleY);
BufferedImage scaleImage = new BufferedImage(mainImage.getWidth(), mainImage.getHeight(), mainImage.getType());
BufferedImageOp scaleOp = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
scaleOp.filter(mainImage, scaleImage);
paintImage(blackImage);
paintImage(scaleImage);
}catch (Exception e) {
System.out.println("Scaling exception = " + e);
AffineTransform tx = AffineTransform.getScaleInstance(0.1, 0.1);
// tx.scale(scaleX, scaleY);
BufferedImage scaleImage = new BufferedImage(mainImage.getWidth(), mainImage.getHeight(), mainImage.getType());
BufferedImageOp scaleOp = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
scaleOp.filter(mainImage, scaleImage);
paintImage(blackImage);
paintImage(scaleImage);
}
}
public void shearFunction(double shearX, double shearY) {
try {
AffineTransform tx = AffineTransform.getShearInstance(shearX / 1000, shearY / 1000);
Rectangle2D box = getBoundingBox(mainImage, tx);
AffineTransform shearing = AffineTransform.getTranslateInstance(-box.getMinX(), -box.getMinY());
tx.preConcatenate(shearing);
BufferedImage shearImage = new BufferedImage((int) Math.round(box.getWidth()), (int) Math.round(box.getHeight()), mainImage.getType());
BufferedImageOp shearOp = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
shearOp.filter(mainImage, shearImage);
paintImage(blackImage);
paintImage(shearImage);
} catch (Exception e) {
System.out.println("Shearing exception = " + e);
// Reset back to default
AffineTransform tx =
AffineTransform.getShearInstance(0.0, 0.0);
Rectangle2D box = getBoundingBox(mainImage, tx);
AffineTransform shearing = AffineTransform.getTranslateInstance(-box.getMinX(), -box.getMinY());
tx.preConcatenate(shearing);
BufferedImage shearImage = new BufferedImage((int) Math.round(box.getWidth()), (int) Math.round(box.getHeight()), mainImage.getType());
BufferedImageOp shearOp = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
shearOp.filter(mainImage, shearImage);
paintImage(blackImage);
paintImage(shearImage);
}
}
public void rotateFunction(double theta) {
AffineTransform tx = AffineTransform.getRotateInstance(theta);
Rectangle2D box = getBoundingBox(mainImage, tx);
AffineTransform translation = AffineTransform.getTranslateInstance(-box.getMinX(), -box.getMinY());
tx.preConcatenate(translation);
int width = (int) Math.round(box.getWidth());
int height = (int) Math.round(box.getHeight());
BufferedImage rotatedImage = new BufferedImage(width, height, mainImage.getType());
BufferedImageOp rotateOp = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
rotateOp.filter(mainImage, rotatedImage);
paintImage(blackImage);
paintImage(rotatedImage);
transformedImage=rotatedImage;
}
public void translateFunction(double transX1, double transY1) {
AffineTransform tx = new AffineTransform();
tx.translate(transX, transY);
BufferedImage translateImage = new BufferedImage(mainImage.getWidth(), mainImage.getHeight(), mainImage.getType());
BufferedImageOp translateOp = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
translateOp.filter(mainImage, translateImage);
paintImage(blackImage);
paintImage(translateImage);
}
public void paintImage(BufferedImage image) {
// ImageIcon icon = new ImageIcon(image);
displayLabel.setVerticalAlignment((int) CENTER_ALIGNMENT);
displayLabel.setHorizontalAlignment((int) CENTER_ALIGNMENT);
//displayLabel.setIcon(new ImageIcon(blackImage));
if (mainImage.getHeight() > displayLabel.getHeight() || mainImage.getWidth() > displayLabel.getWidth()) {
displayLabel.setIcon(new ImageIcon(image.getScaledInstance(displayLabel.getWidth(), displayLabel.getHeight(), image.SCALE_SMOOTH)));
} else {
displayLabel.setIcon(new ImageIcon(image));
}
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/*
* Set the Nimbus look and feel
*/
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/*
* If Nimbus (introduced in Java SE 6) is not available, stay with the
* default look and feel. For details see
* http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(AffineTransformGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(AffineTransformGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(AffineTransformGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(AffineTransformGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/*
* Create and display the form
*/
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new AffineTransformGUI().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
public javax.swing.JMenu AboutMe;
public javax.swing.JButton ClearBtn;
public javax.swing.JButton ExitBtn;
public javax.swing.JFileChooser FileChooser;
public javax.swing.JMenu FileMenu;
public javax.swing.JMenuItem Open;
public javax.swing.JButton ResetBtn;
public javax.swing.JMenuItem Save;
public javax.swing.JComboBox TransformationList;
public javax.swing.JSlider XSlider;
public javax.swing.JSlider YSlider;
public javax.swing.JLabel displayLabel;
public javax.swing.JMenuBar jMenuBar1;
public javax.swing.JPanel mainPanel;
// End of variables declaration//GEN-END:variables
private Rectangle2D getBoundingBox(BufferedImage image, AffineTransform tx) {
int xmax = image.getWidth() - 1;
int ymax = image.getHeight() - 1;
Point2D[] corners = new Point2D.Double[4];
corners[0] = new Point2D.Double(0, 0);
corners[1] = new Point2D.Double(xmax, 0);
corners[2] = new Point2D.Double(xmax, ymax);
corners[3] = new Point2D.Double(0, ymax);
tx.transform(corners, 0, corners, 0, 4);
//Calculat e bounding box of transformed corner points
Rectangle2D boundingBox = new Rectangle2D.Double();
for (int i = 0; i < 4; ++i) {
boundingBox.add(corners[i]);
}
return boundingBox;
}
}
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package assignment11;
/**
*
* @author Vineetrok
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import java.io.File;
public class ImagePreviewPanel extends JPanel
implements PropertyChangeListener {
private int width, height;
private ImageIcon icon;
private Image image;
private static final int ACCSIZE = 155;
private Color bg;
public ImagePreviewPanel() {
setPreferredSize(new Dimension(ACCSIZE, -1));
bg = getBackground();
}
public void propertyChange(PropertyChangeEvent e) {
String propertyName = e.getPropertyName();
// Make sure we are responding to the right event.
if (propertyName.equals(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)) {
File selection = (File)e.getNewValue();
String name;
if (selection == null)
return;
else
name = selection.getAbsolutePath();
if ((name != null) &&
name.toLowerCase().endsWith(".jpg") ||
name.toLowerCase().endsWith(".jpeg") ||
name.toLowerCase().endsWith(".gif") ||
name.toLowerCase().endsWith(".png")) {
icon = new ImageIcon(name);
image = icon.getImage();
scaleImage();
repaint();
}
}
}
private void scaleImage() {
width = image.getWidth(this);
height = image.getHeight(this);
double ratio = 1.0;
if (width >= height) {
ratio = (double)(ACCSIZE-5) / width;
width = ACCSIZE-5;
height = (int)(height * ratio);
}
else {
if (getHeight() > 150) {
ratio = (double)(ACCSIZE-5) / height;
height = ACCSIZE-5;
width = (int)(width * ratio);
}
else {
ratio = (double)getHeight() / height;
height = getHeight();
width = (int)(width * ratio);
}
}
image = image.getScaledInstance(width, height, Image.SCALE_DEFAULT);
}
public void paintComponent(Graphics g) {
g.setColor(bg);
g.fillRect(0, 0, ACCSIZE, getHeight());
g.drawImage(image, getWidth() / 2 - width / 2 + 5,
getHeight() / 2 - height / 2, this);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment