package Horst; import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.awt.image.*; import java.io.*; import java.util.*; import javax.imageio.*; import javax.imageio.stream.*; import javax.swing.*; import javax.swing.filechooser.*; /** * This program demonstrates various image processing operations. * @version 1.03 2007-08-16 * @author Cay Horstmann */ public class ImageProcessingTest { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { JFrame frame = new ImageProcessingFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }); } } /** * This frame has a menu to load an image and to specify various transformations, and a component to * show the resulting image. */ class ImageProcessingFrame extends JFrame { public ImageProcessingFrame() { setTitle("ImageProcessingTest"); setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); add(new JComponent() { public void paintComponent(Graphics g) { if (image != null) g.drawImage(image, 0, 0, null); } }); //Ouvrir une image JMenu fileMenu = new JMenu("File"); JMenuItem openItem = new JMenuItem("Open"); openItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { openFile(); } }); fileMenu.add(openItem); //Sauvegarde JMenu saveItem = new JMenu("Save"); Iterator iter = writerFormats.iterator(); while (iter.hasNext()) { final String formatName = iter.next(); JMenuItem formatItem = new JMenuItem(formatName); saveItem.add(formatItem); formatItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { saveFile(formatName); } }); } fileMenu.add(saveItem); // Exit JMenuItem exitItem = new JMenuItem("Exit"); exitItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { System.exit(0); } }); fileMenu.add(exitItem); JMenu editMenu = new JMenu("Edit"); JMenuItem blurItem = new JMenuItem("Blur"); blurItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { float weight = 1.0f / 9.0f; float[] elements = new float[9]; for (int i = 0; i < 9; i++) elements[i] = weight; convolve(elements); } }); editMenu.add(blurItem); JMenuItem sharpenItem = new JMenuItem("Sharpen"); sharpenItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { float[] elements = { 0.0f, -1.0f, 0.0f, -1.0f, 5.f, -1.0f, 0.0f, -1.0f, 0.0f }; convolve(elements); } }); editMenu.add(sharpenItem); JMenuItem brightenItem = new JMenuItem("Brighten"); brightenItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { float a = 1.1f; // float b = 20.0f; float b = 0; RescaleOp op = new RescaleOp(a, b, null); filter(op); } }); editMenu.add(brightenItem); JMenuItem edgeDetectItem = new JMenuItem("Edge detect"); edgeDetectItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { float[] elements = { 0.0f, -1.0f, 0.0f, -1.0f, 4.f, -1.0f, 0.0f, -1.0f, 0.0f }; convolve(elements); } }); editMenu.add(edgeDetectItem); JMenuItem negativeItem = new JMenuItem("Negative"); negativeItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { short[] negative = new short[256 * 1]; for (int i = 0; i < 256; i++) negative[i] = (short) (255 - i); ShortLookupTable table = new ShortLookupTable(0, negative); LookupOp op = new LookupOp(table, null); filter(op); } }); editMenu.add(negativeItem); JMenuItem rotateItem = new JMenuItem("Rotate"); rotateItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { if (image == null) return; AffineTransform transform = AffineTransform.getRotateInstance(Math.toRadians(5), image.getWidth() / 2, image.getHeight() / 2); AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BICUBIC); filter(op); } }); editMenu.add(rotateItem); JMenuBar menuBar = new JMenuBar(); menuBar.add(fileMenu); menuBar.add(editMenu); setJMenuBar(menuBar); } /** * Open a file and load the image. */ public void openFile() { JFileChooser chooser = new JFileChooser(); chooser.setCurrentDirectory(new File(".")); String[] extensions = ImageIO.getReaderFileSuffixes(); chooser.setFileFilter(new FileNameExtensionFilter("Image files", extensions)); int r = chooser.showOpenDialog(this); if (r != JFileChooser.APPROVE_OPTION) return; try { Image image = ImageIO.read(chooser.getSelectedFile()); image = new BufferedImage(image.getWidth(null), image.getHeight(null),BufferedImage.TYPE_INT_RGB); image.getGraphics().drawImage(image, 0, 0, null); } catch (IOException e) { JOptionPane.showMessageDialog(this, e); } repaint(); } public void saveFile(final String formatName) { if (image == null) return; Iterator iter = ImageIO.getImageWritersByFormatName(formatName); ImageWriter writer = iter.next(); JFileChooser chooser = new JFileChooser(); chooser.setCurrentDirectory(new File(".")); String[] extensions = writer.getOriginatingProvider().getFileSuffixes(); chooser.setFileFilter(new FileNameExtensionFilter("Image files", extensions)); int r = chooser.showSaveDialog(this); if (r != JFileChooser.APPROVE_OPTION) return; File f = chooser.getSelectedFile(); try { ImageOutputStream imageOut = ImageIO.createImageOutputStream(f); writer.setOutput(imageOut); writer.write(new IIOImage(image[0], null, null)); for (int i = 1; i < image.length; i++) { IIOImage iioImage = new IIOImage(image[i], null, null); if (writer.canInsertImage(i)) writer.writeInsert(i, iioImage, null); } } catch (IOException e) { JOptionPane.showMessageDialog(this, e); } } /** * Gets a set of "preferred" format names of all image writers. The preferred format name is the * first format name that a writer specifies. * @return the format name set */ public static Set getWriterFormats() { TreeSet writerFormats = new TreeSet(); TreeSet formatNames = new TreeSet(Arrays.asList(ImageIO .getWriterFormatNames())); while (formatNames.size() > 0) { String name = formatNames.iterator().next(); Iterator iter = ImageIO.getImageWritersByFormatName(name); ImageWriter writer = iter.next(); String[] names = writer.getOriginatingProvider().getFormatNames(); String format = names[0]; if (format.equals(format.toLowerCase())) format = format.toUpperCase(); writerFormats.add(format); formatNames.removeAll(Arrays.asList(names)); } return writerFormats; } /** * Apply a filter and repaint. * @param op the image operation to apply */ private void filter(BufferedImageOp op) { if (image == null) return; image = op.filter(image, null); repaint(); } /** * Apply a convolution and repaint. * @param elements the convolution kernel (an array of 9 matrix elements) */ private void convolve(float[] elements) { Kernel kernel = new Kernel(3, 3, elements); ConvolveOp op = new ConvolveOp(kernel); filter(op); } private BufferedImage[]image; private static Set writerFormats = getWriterFormats(); private static final int DEFAULT_WIDTH = 400; private static final int DEFAULT_HEIGHT = 400; }