ImageOps.java
Upload User: cdlibang
Upload Date: 2016-07-17
Package Size: 774k
Code Size: 11k
Category:

2D Graphic

Development Platform:

Java

  1. /*
  2.  * @(#)ImageOps.java 1.23 99/05/07
  3.  *
  4.  * Copyright (c) 1998, 1999 by Sun Microsystems, Inc. All Rights Reserved.
  5.  * 
  6.  * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
  7.  * modify and redistribute this software in source and binary code form,
  8.  * provided that i) this copyright notice and license appear on all copies of
  9.  * the software; and ii) Licensee does not utilize the software in a manner
  10.  * which is disparaging to Sun.
  11.  * 
  12.  * This software is provided "AS IS," without a warranty of any kind. ALL
  13.  * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
  14.  * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
  15.  * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
  16.  * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
  17.  * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
  18.  * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
  19.  * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
  20.  * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
  21.  * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
  22.  * POSSIBILITY OF SUCH DAMAGES.
  23.  * 
  24.  * This software is not designed or intended for use in on-line control of
  25.  * aircraft, air traffic, aircraft navigation or aircraft communications; or in
  26.  * the design, construction, operation or maintenance of any nuclear
  27.  * facility. Licensee represents and warrants that it will not use or
  28.  * redistribute the Software for such purposes.
  29.  */
  30. package demos.Images;
  31. import java.awt.*;
  32. import java.awt.image.*;
  33. import java.awt.event.*;
  34. import java.awt.geom.AffineTransform;
  35. import javax.swing.*;
  36. import javax.swing.event.*;
  37. import DemoSurface;
  38. import DemoPanel;
  39. import CustomControls;
  40. /**
  41.  * Images drawn using operators such as ConvolveOp LowPass & Sharpen,
  42.  * LookupOp and RescaleOp.
  43.  */
  44. public class ImageOps extends DemoSurface implements CustomControls, ChangeListener {
  45.     private static String imgName[] = { "bld.jpg", "boat.gif" };
  46.     private static BufferedImage img[] = new BufferedImage[imgName.length];
  47.     private static String opsName[] = { 
  48.               "Threshold", "RescaleOp" ,"Invert", "Yellow Invert", "3x3 Blur", 
  49.               "3x3 Sharpen", "3x3 Edge", "5x5 Edge"};
  50.     private static BufferedImageOp biop[] = new BufferedImageOp[opsName.length];
  51.     private static int rescaleFactor = 128;
  52.     private static float rescaleOffset = 0;
  53.     private static int low = 100, high = 200;
  54.     private int opsIndex, imgIndex;
  55.     private DemoControls controls;
  56.  
  57.     static {
  58.         thresholdOp(low, high);
  59.         int i = 1;
  60.         biop[i++] = new RescaleOp(1.0f, 0, null);
  61.         byte invert[] = new byte[256];
  62.         byte ordered[] = new byte[256];
  63.         for (int j = 0; j < 256 ; j++) {
  64.             invert[j] = (byte) (256-j);
  65.             ordered[j] = (byte) j;
  66.         }
  67.         biop[i++] = new LookupOp(new ByteLookupTable(0,invert), null);
  68.         byte[][] yellowInvert = new byte[][] { invert, invert, ordered };
  69.         biop[i++] = new LookupOp(new ByteLookupTable(0,yellowInvert), null);
  70.         int dim[][] = {{3,3}, {3,3}, {3,3}, {5,5}};
  71.         float data[][] = { {0.1f, 0.1f, 0.1f,              // 3x3 blur
  72.                             0.1f, 0.2f, 0.1f,
  73.                             0.1f, 0.1f, 0.1f},
  74.                            {-1.0f, -1.0f, -1.0f,           // 3x3 sharpen
  75.                             -1.0f, 9.0f, -1.0f,
  76.                             -1.0f, -1.0f, -1.0f},
  77.                            { 0.f, -1.f,  0.f,                  // 3x3 edge
  78.                             -1.f,  5.f, -1.f,
  79.                              0.f, -1.f,  0.f},
  80.                            {-1.0f, -1.0f, -1.0f, -1.0f, -1.0f,  // 5x5 edge
  81.                             -1.0f, -1.0f, -1.0f, -1.0f, -1.0f,
  82.                             -1.0f, -1.0f, 24.0f, -1.0f, -1.0f,
  83.                             -1.0f, -1.0f, -1.0f, -1.0f, -1.0f,
  84.                             -1.0f, -1.0f, -1.0f, -1.0f, -1.0f}};
  85.         for (int j = 0; j < data.length; j++, i++) {
  86.             biop[i] = new ConvolveOp(new Kernel(dim[j][0],dim[j][1],data[j]));
  87.         }
  88.     }
  89.     protected JSlider slider1, slider2;
  90.     public ImageOps() {
  91.         setBackground(Color.white);
  92.         for (int i = 0; i < imgName.length; i++) {
  93.             Image image = getImage(imgName[i]);
  94.             int iw = image.getWidth(this);
  95.             int ih = image.getHeight(this);
  96.             img[i] = new BufferedImage(iw, ih, BufferedImage.TYPE_INT_RGB);
  97.             img[i].createGraphics().drawImage(image,0,0,null);
  98.         }
  99.         controls = new DemoControls(this);
  100.     }
  101.     public String[] getCustomControlsConstraints() {
  102.         return new String[] { BorderLayout.NORTH, 
  103.                                 BorderLayout.WEST, 
  104.                                 BorderLayout.EAST };
  105.     }
  106.     public Component[] getCustomControls() {
  107.         slider1 = new JSlider(JSlider.VERTICAL, 0, 255, low);
  108.         slider1.setPreferredSize(new Dimension(15, 100));
  109.         slider1.addChangeListener(this);
  110.         slider2 = new JSlider(JSlider.VERTICAL, 0, 255, high);
  111.         slider2.setPreferredSize(new Dimension(15, 100));
  112.         slider2.addChangeListener(this);
  113.         return new Component[] { (Component) controls, slider1, slider2 };
  114.     }
  115.     public void customControlsThread(int state) {
  116.         if (state == CustomControls.START) {
  117.             controls.start();
  118.         } else if (state == CustomControls.STOP) {
  119.             controls.stop();
  120.         }
  121.     }
  122.     public static void thresholdOp(int low, int high) {
  123.         byte threshold[] = new byte[256];
  124.         for (int j = 0; j < 256 ; j++) {
  125.             if (j > high) {
  126.                 threshold[j] = (byte) 255;
  127.             } else if (j < low) {
  128.                 threshold[j] = (byte) 0;
  129.             } else {
  130.                 threshold[j] = (byte) j;
  131.             }
  132.         }
  133.         biop[0] = new LookupOp(new ByteLookupTable(0,threshold), null);
  134.     }
  135.     public void drawDemo(int w, int h, Graphics2D g2) {
  136.         int iw = img[imgIndex].getWidth(null);
  137.         int ih = img[imgIndex].getHeight(null);
  138.         BufferedImage bimg = new BufferedImage(iw,ih,BufferedImage.TYPE_INT_RGB);
  139.         biop[opsIndex].filter(img[imgIndex], bimg);
  140.         g2.drawImage(bimg,0,0,w,h,null);
  141.     }
  142.     public void stateChanged(ChangeEvent e) {
  143.         // when using these sliders use double buffering, which means
  144.         // ignoring when DemoSurface.imageType = 'On Screen'
  145.         if (getImageType() <= 1) {
  146.             setImageType(2);
  147.         }
  148.         if (e.getSource().equals(slider1)) {
  149.             if (opsIndex == 0) {
  150.                 thresholdOp(slider1.getValue(), high);
  151.             } else {
  152.                 rescaleFactor = slider1.getValue();
  153.                 biop[1] = new RescaleOp((float)rescaleFactor/128.0f, rescaleOffset, null);
  154.             }
  155.         } else {
  156.             if (opsIndex == 0) {
  157.                 thresholdOp(low, slider2.getValue());
  158.             } else {
  159.                 rescaleOffset = (float) slider2.getValue();
  160.                 biop[1] = new RescaleOp((float)rescaleFactor/128.0f, rescaleOffset, null);
  161.             }
  162.         }
  163.         repaint();
  164.     }
  165.     public static void main(String s[]) {
  166.         JFrame f = new JFrame("Java2D Demo - ImageOps");
  167.         f.addWindowListener(new WindowAdapter() {
  168.             public void windowClosing(WindowEvent e) {System.exit(0);}
  169.         });
  170.         f.getContentPane().add("Center", new DemoPanel(new ImageOps()));
  171.         f.pack();
  172.         f.setSize(new Dimension(400,300));
  173.         f.show();
  174.     }
  175.     static class DemoControls extends JPanel implements ActionListener, Runnable {
  176.         ImageOps demo;
  177.         JComboBox imgCombo, opsCombo;
  178.         Font font = new Font("serif", Font.PLAIN, 10);
  179.         Thread thread;
  180.         public DemoControls(ImageOps demo) {
  181.             this.demo = demo;
  182.             setBackground(Color.gray);
  183.             add(imgCombo = new JComboBox());
  184.             imgCombo.setFont(font);
  185.             for (int i = 0; i < ImageOps.imgName.length; i++) {
  186.                 imgCombo.addItem(ImageOps.imgName[i]);
  187.             }
  188.             imgCombo.addActionListener(this);
  189.             add(opsCombo = new JComboBox());
  190.             opsCombo.setFont(font);
  191.             for (int i = 0; i < ImageOps.opsName.length; i++) {
  192.                 opsCombo.addItem(ImageOps.opsName[i]);
  193.             }
  194.             opsCombo.addActionListener(this);
  195.             addMouseListener(new MouseAdapter() {
  196.                 public void mouseClicked(MouseEvent e) {
  197.                     if (thread == null) start(); else stop();
  198.                 }
  199.             });
  200.         }
  201.         public void actionPerformed(ActionEvent e) {
  202.             if (e.getSource().equals(opsCombo)) {
  203.                 demo.opsIndex = opsCombo.getSelectedIndex();
  204.                 if (demo.opsIndex == 0) {
  205.                     demo.slider1.setValue(demo.low);
  206.                     demo.slider2.setValue(demo.high);
  207.                     demo.slider1.setEnabled(true);
  208.                     demo.slider2.setEnabled(true);
  209.                 } else if (demo.opsIndex == 1) {
  210.                     demo.slider1.setValue(demo.rescaleFactor);
  211.                     demo.slider2.setValue((int) demo.rescaleOffset);
  212.                     demo.slider1.setEnabled(true);
  213.                     demo.slider2.setEnabled(true);
  214.                 } else {
  215.                     demo.slider1.setEnabled(false);
  216.                     demo.slider2.setEnabled(false);
  217.                 }
  218.             } else if (e.getSource().equals(imgCombo)) {
  219.                 demo.imgIndex = imgCombo.getSelectedIndex();
  220.             }
  221.             demo.repaint(10);
  222.         }
  223.         public Dimension getPreferredSize() {
  224.             return new Dimension(200,32);
  225.         }
  226.         public void start() {
  227.             if (thread != null) {
  228.                 return;
  229.             }
  230.             thread = new Thread(this);
  231.             thread.setPriority(Thread.MIN_PRIORITY);
  232.             thread.setName("Images.ImageOps DemoControls Thread");
  233.             thread.start();
  234.         }
  235.         public synchronized void stop() {
  236.             if (thread != null) {
  237.                 thread.interrupt();
  238.             }
  239.             thread = null;
  240.             notifyAll();
  241.         }
  242.         public void run() {
  243.             try { thread.sleep(1111); } catch (Exception e) { return; }
  244.             Thread me = Thread.currentThread();
  245.             while (thread == me) {
  246.                 for (int i = 0; i < ImageOps.imgName.length; i++) {
  247.                     imgCombo.setSelectedIndex(i);
  248.                     for (int j = 0; j < ImageOps.opsName.length; j++) {
  249.                         opsCombo.setSelectedIndex(j);
  250.                         if (j <= 1) {
  251.                             for (int k = 50; k <= 200; k+=10) {
  252.                                 demo.slider1.setValue(k);
  253.                                 try {
  254.                                     thread.sleep(200);
  255.                                 } catch (InterruptedException e) { return; }
  256.                             }
  257.                         }
  258.                         try {
  259.                             thread.sleep(4444);
  260.                         } catch (InterruptedException e) { return; }
  261.                     }
  262.                 }
  263.             }
  264.             thread = null;
  265.         }
  266.     } // End DemoControls
  267. } // End ImageOps