Created
October 11, 2012 13:14
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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