ImageResize source code:
import
java.awt.*;
import
java.awt.event.*;
import
javax.swing.*;
import
javax.swing.event.*;
import
java.awt.image.*;
import
javax.swing.filechooser.*;
import
java.io.*;
import
javax.imageio.*;
import
javax.imageio.stream.*;
import
java.awt.geom.*;
import
java.util.*;
class
ImageArea extends Canvas implements ImageObserver{
BufferedImage
img;
Dimension
ds;
static String filename;
int w;
int h;
ImageArea(){
1 ds=getToolkit().getScreenSize();
}
2 public void paint(Graphics g){
int
x=-w/2;
int
y=-h/2;
drawIt(g,img,x,y);
}
3 public void setImageWidth(int width){
w=width;
}
4 public void setImageHeight(int
height){
h=height;
}
5 public void drawIt(Graphics g,
BufferedImage img,int x,int y){
Graphics2D
g2d=(Graphics2D)g;
int
mX=(int)ds.getWidth()/2;
int
mY=(int)ds.getHeight()/2;
g2d.translate(mX,mY);
//move the coordinate
g2d.drawImage(img,x,y,w,h,this);
//draw the image
}
6 public void setImageData(BufferedImage
bi){
img=bi;
}
7 public void saveResizedImage(){
BufferedImage
bi=(BufferedImage)createImage(w,h); //create empty BufferedImage object
Graphics2D
g2d=(Graphics2D)bi.createGraphics(); //Create the Graphics2D object from the
BufferedImage object
g2d.drawImage(img,0,0,w,h,this);
//draw the current resized image on the BufferedImage object
try{
Calendar
cd=Calendar.getInstance();
String
resizedFileName=new String(cd.getTimeInMillis()+".jpg");
ImageIO.write(bi,"jpg",new
File(resizedFileName)); //save the resized image file
}catch(IOException
e){System.out.println("Error in saving the file...");}
}
}
8 class Show extends JFrame implements
ActionListener{
JPanel panel;
JButton btOK;
JTextField txtWidth;
JTextField txtHeight;
ImageArea ia;
BufferedImage bi;
Show(){
setTitle("Image
resize");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setExtendedState(this.getExtendedState()
| this.MAXIMIZED_BOTH);
JMenuBar mainmenu=new
JMenuBar();
JMenu menu=new
JMenu("File");
JMenuItem mopen=new
JMenuItem("Open...");
mopen.setMnemonic(KeyEvent.VK_O);
mopen.addActionListener(this);
JMenuItem mexit=new
JMenuItem("Exit");
mexit.setMnemonic(KeyEvent.VK_X);
mexit.addActionListener(this);
menu.add(mopen);
menu.add(mexit);
mainmenu.add(menu);
setJMenuBar(mainmenu);
ia=new ImageArea();
add(ia,BorderLayout.CENTER
);
btOK=new
JButton("OK");
btOK.setBackground(Color.BLACK);
btOK.setForeground(Color.BLUE);
btOK.setToolTipText("Save
the resized image file");
btOK.addActionListener(this);
txtWidth=new
JTextField(4);
txtWidth.addKeyListener(new
KeyList());
txtHeight=new
JTextField(4);
txtHeight.addKeyListener(new
KeyList());
panel=new JPanel();
panel.setLayout(new
FlowLayout());
panel.add(new
JLabel("Width:"));
panel.add(txtWidth);
panel.add(new
JLabel("Height:"));
panel.add(txtHeight);
panel.add(btOK);
panel.setBackground(Color.GRAY);
add(panel,
BorderLayout.SOUTH);
setVisible(true);
activateControls(false);
}
9 public void
actionPerformed(ActionEvent e){
if(e.getSource()==btOK)
{
ia.saveResizedImage();
}
else {
JMenuItem
source = (JMenuItem)(e.getSource());
if(source.getText().compareTo("Open...")==0)
{
setImage();
if(bi!=null){
txtWidth.setText(bi.getWidth()+"");
txtHeight.setText(bi.getHeight()+"");
activateControls(true);
ia.repaint();
validate();//make
sure the components display correctly
}
}
else
if(source.getText().compareTo("Exit")==0)
System.exit(0);
}
}
10 public
void activateControls(boolean f){
txtWidth.setEnabled(f);
txtHeight.setEnabled(f);
btOK.setEnabled(f);
}
11 public
class KeyList extends KeyAdapter{
public void keyTyped(KeyEvent ke){
char c =
ke.getKeyChar(); //get the character pressed
int intkey=(int)c; //the
character code
if(!(intkey>=48
&& intkey<=57 || intkey==8 || intkey==127))
{
ke.consume();
//hide the key
}
}
public
void keyReleased(KeyEvent e){
//the image resizes when
the key released
if(!txtWidth.getText().equals("")
&& !txtHeight.getText().equals("")){
ia.setImageWidth(Integer.parseInt(txtWidth.getText()));
ia.setImageHeight(Integer.parseInt(txtHeight.getText()));
ia.repaint();
}
}
}
12 public
void setImage(){
JFileChooser chooser =
new JFileChooser(); //create file chooser object
FileNameExtensionFilter
filter = new FileNameExtensionFilter("Image files", "jpg",
"gif","bmp","png"); //create filter object
chooser.setFileFilter(filter);
//apply the file filter to the file chooser object
chooser.setMultiSelectionEnabled(false);
//only one file is selected at once
int
returnVal = chooser.showOpenDialog(this); //show the file chooser dialog
if(returnVal
== JFileChooser.APPROVE_OPTION) {
String
filename=chooser.getSelectedFile().toString(); //get selected file path
prepareImage(filename);
//invoke the prepareImage method to send image width, height, and data to the
ShowArea class
}
}
13 public
void prepareImage(String filename){
try{
bi=ImageIO.read(new
File(filename)); //read the image data
ia.setImageData(bi);
//send the image data to the ShowArea class
ia.setImageWidth(bi.getWidth());
//send the image width to the ShowArea class
ia.setImageHeight(bi.getHeight());//send
the image height to the ShowArea class
}
catch(IOException
e){System.out.println("Problem to load the image file...");}
catch(NullPointerException
e){System.out.println("You may select invalid image file...");}
}
}
public class
ImageResize{
public static void main(String
args[]){
new
Show();
}
}
Code Explanation
1 Get the width and height of the computer screen.
2 The paint method of the Canvas class is invoked automatically when the Canvas object is created. It invokes the drawIt method to draw the image at the specified location.
3 The setImageWidth is used to set the width of the image.
4 The setImageHeight is used to set the height of the image.
These method are invoked from the Show class at the keyReleased method to set the width and height of the image to display on the program window.
5 The drawIt method uses the Graphics2D class to display the image. The translate(x,y) method of the Graphics2D class moves the original coordinate (0,0) to the (x,y) coordinate or position.
We use the drawImage method to display the image at the (x,y) position.
6 The setImageData has code to set the data of the image to be displayed. This method is invoked from the Show class to pass the image selected by the user to the ImageArea class so it is ready to draw on the drawing area.
7 The saveResizedImage method saves the resized image in a separated file. Before saving the file, an BufferedImage object bi is created then the current resized image is drawn this object so it is ready to save the file in the disk drive.
8 The Show class extends JFrame. It defines the program interface. In this program, the image is displayed by adding the ImageArea object ia at the center of the program window. We need two text boxes (txtWidth and txtHeight) to allow the user inputs or edits the width and height of the image. The OK button btOk invokes the saveResizedImage to save the resized image to the disk drive. The txtWidth, txtHeight, and btOK button are disabled (by invoking the activateControls method) when the program firstly opens.
9 The actionPeformed method has code to enable the btOK button and menu items to perform their tasks when the user clicks them. If the btOK button is clicked the saveResizedImage method is invoked to save the resized image to the disk drive. If the menu item Open is clicked the file chooser dialog box displays so the user can select the image file to display on the program window. The width and height of the image are displayed in the txtWidth and txtHeight text boxes.
The txtWidth, txtHeight, and btOK button are enabled (by invoking the activateControls method) if the valid image is selected to show on the program window. We don't allow the user to input or edit values in the text boxes or click the btOK button if there is no active image on the program window.
10 The activateControls method is implemented to enable or disable txtWidth, txtHeight, and btOK components. It accepts true or false value as its argument The true value indicates that the components are enabled. Otherwise, the components are disabled.
11 The KeyList extends the KeyAdpater class to implement the keyTyped and keyReleased methods.
The keyTyped method defines code to hide key input if it is not a digit, backspace, or delete key. The
keyReleased method passes the width and height of the image to the ShowArea class so the image can be drawn on the ShowArea drawing object with this width and height when the user inputs or edits values in the width or height text boxes. When the size of the image changes, you need to invoke the repaint method of the ShowArea class, otherwise the image does not show.
12 The setImage method defines code to allow the user to choose the image file from the file chooser dialog.
When a valid image is selected, the width, height, and data of the image are sent to the ShowArea class by invoking the prepareImage method.
13 The prepareImage method defines code to send the width, height and data of the image the ShowArea class so it is ready to draw on the drawing area. This method is invoked when the user selects the image file from file chooser dialog.
No comments:
Post a Comment