|
Image Input and Output
in Java |
|
Prof. David Bernstein |
| Computer Science Department |
| bernstdh@jmu.edu |
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
/**
* A PaintJob object is analgous to a java.awt.print.PrinterJob object
* in that it controls the saving of "snapshot" images.
*
* In this case, rather than create a Paintable interface, this class
* works with JComponent objects (all of which have a paint() method).
*
* @author Prof. David Bernstein, James Madison University
* @version 1.0
*/
public class PaintJob
{
private JComboBox formatField;
private JComponent paintable;
private JFileChooser jfc;
private JTextField heightField, widthField;
private static final String[] formats ={"bmp","gif","jpeg","png","tiff"};
/**
* Default Constructor
*/
private PaintJob()
{
JPanel accessory, center, rows;
// Construct the various GUI components
jfc = new JFileChooser();
widthField = new JTextField();
heightField = new JTextField();
formatField = new JComboBox(formats);
formatField.setEditable(false);
// Layout the additional information in the JFileChooser
accessory = new JPanel();
accessory.setLayout(new BorderLayout());
accessory.add(new JLabel("Image Info", SwingConstants.CENTER),
BorderLayout.NORTH);
rows = new JPanel();
rows.setLayout(new GridLayout(3,2));
rows.add(new JLabel("Width:"));
rows.add(widthField);
rows.add(new JLabel("Height:"));
rows.add(heightField);
rows.add(new JLabel("Format:"));
rows.add(formatField);
center = new JPanel();
center.setLayout(new BorderLayout());
center.add(rows, BorderLayout.NORTH);
accessory.add(center, BorderLayout.CENTER);
jfc.setAccessory(accessory);
}
/**
* Creates and returns a PaintJob
*
* @return A PintJobe
*/
public static PaintJob getPaintJob()
{
return new PaintJob();
}
/*
* Intructs this PaintJob what JComponent to render
* (i.e., what JComponent to take a "snapsht" image of)
*
* @param component The JComponent that will be rendered
*/
public void setPaintable(JComponent component)
{
this.paintable = component;
}
/**
* Presents a dialog to the user for changing the properties
* of the PaintJob
*
* @return true if the user does not cancel the dialog; false otherwise.
*/
public boolean saveDialog()
{
int choice;
Dimension size;
if (paintable != null)
{
size = paintable.getSize();
widthField.setText(""+size.width);
heightField.setText(""+size.width);
}
choice = jfc.showSaveDialog(paintable);
return (choice == JFileChooser.APPROVE_OPTION);
}
/**
* Creates and saves the "snapshot" image
*/
public void save() throws IOException
{
BufferedImage image;
File file;
Graphics2D g2;
int height, width;
String fileType;
// Check to make sure everything is setup properly
file = jfc.getSelectedFile();
if (file == null) throw new IOException("No File was selected.");
try
{
width = Integer.parseInt(widthField.getText());
height = Integer.parseInt(heightField.getText());
}
catch (NumberFormatException nfe)
{
throw new IOException("Invalid width and/or height.");
}
// Construct a BufferedImage of appropriate size and get the
// rendering engine
image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
g2 = image.createGraphics();
// Render the image
paintable.paint(g2);
// Save the image
fileType = (String)formatField.getSelectedItem();
ImageIO.write(image, fileType, file);
}
}