home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / JBuilder8.iso / Solaris / resource / jre / demo / jfc / Java2D / src / java2d / demos / Images / ImageOps.java < prev    next >
Encoding:
Java Source  |  2002-09-06  |  10.0 KB  |  261 lines

  1. /*
  2.  * Copyright (c) 2002 Sun Microsystems, Inc. All  Rights Reserved.
  3.  * 
  4.  * Redistribution and use in source and binary forms, with or without
  5.  * modification, are permitted provided that the following conditions
  6.  * are met:
  7.  * 
  8.  * -Redistributions of source code must retain the above copyright
  9.  *  notice, this list of conditions and the following disclaimer.
  10.  * 
  11.  * -Redistribution in binary form must reproduct the above copyright
  12.  *  notice, this list of conditions and the following disclaimer in
  13.  *  the documentation and/or other materials provided with the distribution.
  14.  * 
  15.  * Neither the name of Sun Microsystems, Inc. or the names of contributors
  16.  * may be used to endorse or promote products derived from this software
  17.  * without specific prior written permission.
  18.  * 
  19.  * This software is provided "AS IS," without a warranty of any kind. ALL
  20.  * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
  21.  * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
  22.  * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT
  23.  * BE LIABLE FOR ANY DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT
  24.  * OF OR RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR ITS
  25.  * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
  26.  * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
  27.  * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
  28.  * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN
  29.  * IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  30.  * 
  31.  * You acknowledge that Software is not designed, licensed or intended for
  32.  * use in the design, construction, operation or maintenance of any nuclear
  33.  * facility.
  34.  */
  35.  
  36. /*
  37.  * @(#)ImageOps.java    1.28 02/06/13
  38.  */
  39.  
  40. package java2d.demos.Images;
  41.  
  42. import java.awt.*;
  43. import java.awt.image.*;
  44. import java.awt.event.*;
  45. import java.awt.geom.AffineTransform;
  46. import javax.swing.*;
  47. import javax.swing.event.*;
  48. import java2d.ControlsSurface;
  49. import java2d.CustomControls;
  50.  
  51.  
  52.  
  53. /**
  54.  * Images drawn using operators such as ConvolveOp LowPass & Sharpen,
  55.  * LookupOp and RescaleOp.
  56.  */
  57. public class ImageOps extends ControlsSurface implements ChangeListener {
  58.  
  59.     protected JSlider slider1, slider2;
  60.     private static String imgName[] = { "bld.jpg", "boat.png" };
  61.     private static BufferedImage img[] = new BufferedImage[imgName.length];
  62.     private static String opsName[] = { 
  63.               "Threshold", "RescaleOp" ,"Invert", "Yellow Invert", "3x3 Blur", 
  64.               "3x3 Sharpen", "3x3 Edge", "5x5 Edge"};
  65.     private static BufferedImageOp biop[] = new BufferedImageOp[opsName.length];
  66.     private static int rescaleFactor = 128;
  67.     private static float rescaleOffset = 0;
  68.     private static int low = 100, high = 200;
  69.     private int opsIndex, imgIndex;
  70.  
  71.     static {
  72.         thresholdOp(low, high);
  73.         int i = 1;
  74.         biop[i++] = new RescaleOp(1.0f, 0, null);
  75.         byte invert[] = new byte[256];
  76.         byte ordered[] = new byte[256];
  77.         for (int j = 0; j < 256 ; j++) {
  78.             invert[j] = (byte) (256-j);
  79.             ordered[j] = (byte) j;
  80.         }
  81.         biop[i++] = new LookupOp(new ByteLookupTable(0,invert), null);
  82.         byte[][] yellowInvert = new byte[][] { invert, invert, ordered };
  83.         biop[i++] = new LookupOp(new ByteLookupTable(0,yellowInvert), null);
  84.         int dim[][] = {{3,3}, {3,3}, {3,3}, {5,5}};
  85.         float data[][] = { {0.1f, 0.1f, 0.1f,              // 3x3 blur
  86.                             0.1f, 0.2f, 0.1f,
  87.                             0.1f, 0.1f, 0.1f},
  88.                            {-1.0f, -1.0f, -1.0f,           // 3x3 sharpen
  89.                             -1.0f, 9.0f, -1.0f,
  90.                             -1.0f, -1.0f, -1.0f},
  91.                            { 0.f, -1.f,  0.f,                  // 3x3 edge
  92.                             -1.f,  5.f, -1.f,
  93.                              0.f, -1.f,  0.f},
  94.                            {-1.0f, -1.0f, -1.0f, -1.0f, -1.0f,  // 5x5 edge
  95.                             -1.0f, -1.0f, -1.0f, -1.0f, -1.0f,
  96.                             -1.0f, -1.0f, 24.0f, -1.0f, -1.0f,
  97.                             -1.0f, -1.0f, -1.0f, -1.0f, -1.0f,
  98.                             -1.0f, -1.0f, -1.0f, -1.0f, -1.0f}};
  99.         for (int j = 0; j < data.length; j++, i++) {
  100.             biop[i] = new ConvolveOp(new Kernel(dim[j][0],dim[j][1],data[j]));
  101.         }
  102.     }
  103.  
  104.  
  105.     public ImageOps() {
  106.         setBackground(Color.white);
  107.         for (int i = 0; i < imgName.length; i++) {
  108.             Image image = getImage(imgName[i]);
  109.             int iw = image.getWidth(this);
  110.             int ih = image.getHeight(this);
  111.             img[i] = new BufferedImage(iw, ih, BufferedImage.TYPE_INT_RGB);
  112.             img[i].createGraphics().drawImage(image,0,0,null);
  113.         }
  114.         slider1 = new JSlider(JSlider.VERTICAL, 0, 255, low);
  115.         slider1.setPreferredSize(new Dimension(15, 100));
  116.         slider1.addChangeListener(this);
  117.         slider2 = new JSlider(JSlider.VERTICAL, 0, 255, high);
  118.         slider2.setPreferredSize(new Dimension(15, 100));
  119.         slider2.addChangeListener(this);
  120.         setControls(new Component[]{new DemoControls(this),slider1,slider2});
  121.         setConstraints(new String[] { 
  122.             BorderLayout.NORTH, BorderLayout.WEST, BorderLayout.EAST });
  123.     }
  124.  
  125.  
  126.     public static void thresholdOp(int low, int high) {
  127.         byte threshold[] = new byte[256];
  128.         for (int j = 0; j < 256 ; j++) {
  129.             if (j > high) {
  130.                 threshold[j] = (byte) 255;
  131.             } else if (j < low) {
  132.                 threshold[j] = (byte) 0;
  133.             } else {
  134.                 threshold[j] = (byte) j;
  135.             }
  136.         }
  137.         biop[0] = new LookupOp(new ByteLookupTable(0,threshold), null);
  138.     }
  139.  
  140.  
  141.     public void render(int w, int h, Graphics2D g2) {
  142.         int iw = img[imgIndex].getWidth(null);
  143.         int ih = img[imgIndex].getHeight(null);
  144.         BufferedImage bi = new BufferedImage(iw,ih,BufferedImage.TYPE_INT_RGB);
  145.         biop[opsIndex].filter(img[imgIndex], bi);
  146.         g2.drawImage(bi,0,0,w,h,null);
  147.     }
  148.  
  149.  
  150.     public void stateChanged(ChangeEvent e) {
  151.         // when using these sliders use double buffering, which means
  152.         // ignoring when DemoSurface.imageType = 'On Screen'
  153.         if (getImageType() <= 1) {
  154.             setImageType(2);
  155.         }
  156.         if (e.getSource().equals(slider1)) {
  157.             if (opsIndex == 0) {
  158.                 thresholdOp(slider1.getValue(), high);
  159.             } else {
  160.                 rescaleFactor = slider1.getValue();
  161.                 biop[1] = new RescaleOp((float)rescaleFactor/128.0f, rescaleOffset, null);
  162.             }
  163.         } else {
  164.             if (opsIndex == 0) {
  165.                 thresholdOp(low, slider2.getValue());
  166.             } else {
  167.                 rescaleOffset = (float) slider2.getValue();
  168.                 biop[1] = new RescaleOp((float)rescaleFactor/128.0f, rescaleOffset, null);
  169.             }
  170.  
  171.         }
  172.         repaint();
  173.     }
  174.  
  175.  
  176.     public static void main(String s[]) {
  177.         createDemoFrame(new ImageOps());
  178.     }
  179.  
  180.  
  181.     static class DemoControls extends CustomControls implements ActionListener {
  182.  
  183.         ImageOps demo;
  184.         JComboBox imgCombo, opsCombo;
  185.         Font font = new Font("serif", Font.PLAIN, 10);
  186.  
  187.         public DemoControls(ImageOps demo) {
  188.             super(demo.name);
  189.             this.demo = demo;
  190.             setBackground(Color.gray);
  191.             add(imgCombo = new JComboBox());
  192.             imgCombo.setFont(font);
  193.             for (int i = 0; i < ImageOps.imgName.length; i++) {
  194.                 imgCombo.addItem(ImageOps.imgName[i]);
  195.             }
  196.             imgCombo.addActionListener(this);
  197.             add(opsCombo = new JComboBox());
  198.             opsCombo.setFont(font);
  199.             for (int i = 0; i < ImageOps.opsName.length; i++) {
  200.                 opsCombo.addItem(ImageOps.opsName[i]);
  201.             }
  202.             opsCombo.addActionListener(this);
  203.         }
  204.  
  205.  
  206.         public void actionPerformed(ActionEvent e) {
  207.             if (e.getSource().equals(opsCombo)) {
  208.                 demo.opsIndex = opsCombo.getSelectedIndex();
  209.                 if (demo.opsIndex == 0) {
  210.                     demo.slider1.setValue(demo.low);
  211.                     demo.slider2.setValue(demo.high);
  212.                     demo.slider1.setEnabled(true);
  213.                     demo.slider2.setEnabled(true);
  214.                 } else if (demo.opsIndex == 1) {
  215.                     demo.slider1.setValue(demo.rescaleFactor);
  216.                     demo.slider2.setValue((int) demo.rescaleOffset);
  217.                     demo.slider1.setEnabled(true);
  218.                     demo.slider2.setEnabled(true);
  219.                 } else {
  220.                     demo.slider1.setEnabled(false);
  221.                     demo.slider2.setEnabled(false);
  222.                 }
  223.             } else if (e.getSource().equals(imgCombo)) {
  224.                 demo.imgIndex = imgCombo.getSelectedIndex();
  225.             }
  226.             demo.repaint(10);
  227.         }
  228.  
  229.  
  230.         public Dimension getPreferredSize() {
  231.             return new Dimension(200,32);
  232.         }
  233.  
  234.  
  235.         public void run() {
  236.             try { thread.sleep(1111); } catch (Exception e) { return; }
  237.             Thread me = Thread.currentThread();
  238.             while (thread == me) {
  239.                 for (int i = 0; i < ImageOps.imgName.length; i++) {
  240.                     imgCombo.setSelectedIndex(i);
  241.                     for (int j = 0; j < ImageOps.opsName.length; j++) {
  242.                         opsCombo.setSelectedIndex(j);
  243.                         if (j <= 1) {
  244.                             for (int k = 50; k <= 200; k+=10) {
  245.                                 demo.slider1.setValue(k);
  246.                                 try {
  247.                                     thread.sleep(200);
  248.                                 } catch (InterruptedException e) { return; }
  249.                             }
  250.                         }
  251.                         try {
  252.                             thread.sleep(4444);
  253.                         } catch (InterruptedException e) { return; }
  254.                     }
  255.                 }
  256.             }
  257.             thread = null;
  258.         }
  259.     } // End DemoControls
  260. } // End ImageOps
  261.