2011年5月6日 星期五

2011/05/06上課內容

上次的作業答案:
原本程式碼為
import javax.swing.Timer;
import java.awt.event.*;
import java.util.*;
public class TimerDemo implements ActionListener {
  Timer t = new Timer(1000,this);
  TimerDemo() {
    t.start();
    }
  public static void main(String args[]) {
    TimerDemo td = new TimerDemo();
    // create a dummy frame to keep the JVM running
    //  (for demonstation purpose)
    java.awt.Frame dummy = new java.awt.Frame();
    dummy.setVisible(true);
    }
  public void actionPerformed(ActionEvent e) {
    if (e.getSource() == t) {
      System.out.println
        ("\007Being ticked " + Calendar.getInstance().getTime());
      }
    }
}
修改過後為:
import javax.swing.Timer;
import java.awt.event.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
public class TimerDemo extends JFrame implements ActionListener {
  Timer t = new Timer(1000,this);
  static JTextField tbx1=new JTextField(20); 
  TimerDemo() {
    t.start();
    }
  public static void main(String args[]) {
    TimerDemo td = new TimerDemo();
    FlowLayout flow=new FlowLayout();
    td.setLayout(flow);
    td.setSize(450,150);
    JPanel p1 = new JPanel(flow);
    td.add(p1);
    p1.add(tbx1);
    td.setVisible(true);
    }
  public void actionPerformed(ActionEvent e) {
    if (e.getSource() == t) {
      tbx1.setText("" + Calendar.getInstance().getTime());
      }
    }
}
之後下載ip-demo2.zip的壓縮檔案以及negun3276.tif
此為別人設計的具修改圖片功能的套件
作業:將裡面的IPDemo.java其中一個功能(例如雜訊)不用靠按鍵就顯示出來,
   並把所有的按鍵去除
IPDemo.java原程式碼:
import ij.*;
import java.applet.*;
import java.awt.*;
import ij.process.*;
/**Simple applet that demonstrates how to use ImageJ's ImageProcessor class.*/
public class IPDemo extends Applet {
 String name;
 Image img;
 ImageProcessor ip = null;
 public void init() {
  setLayout(new BorderLayout());
  Panel p = new Panel();
  p.setLayout(new GridLayout(5, 3));
  p.add(new Button("Reset"));
  p.add(new Button("Flip"));
  p.add(new Button("Invert"));
  p.add(new Button("Lighten"));
  p.add(new Button("Darken"));
  p.add(new Button("Rotate"));
  p.add(new Button("Zoom In"));
  p.add(new Button("Zoom Out"));
  p.add(new Button("Threshsold"));
  p.add(new Button("Smooth"));
  p.add(new Button("Sharpen"));
  p.add(new Button("Find Edges"));
  p.add(new Button("Macro 1"));
  p.add(new Button("Macro 2"));
  p.add(new Button("Add Noise"));
  add("South", p);
  name = getParameter("img");
  img = getImage(getDocumentBase(), name);
  MediaTracker tracker = new MediaTracker(this);
  tracker.addImage(img, 0);
  try {tracker.waitForID(0);}
  catch (InterruptedException e){}
  if (name.endsWith("jpg"))
   ip = new ColorProcessor(img);
  else
   ip = new ByteProcessor(img);
  ip.snapshot();
 }

 public void update(Graphics g) {
  paint(g);
 }
 public void paint(Graphics g) {
  g.drawImage(img, 0, 0, this);
 }
 public boolean action(Event e, Object arg) {
  if (e.target instanceof Button) {
   String label = (String)arg;
   if (label.equals("Reset"))
    ip.reset();
   else if (label.equals("Flip"))
    ip.flipVertical();
   else if (label.equals("Invert"))
    ip.invert();
   else if (label.equals("Lighten"))
    ip.multiply(0.9);
   else if (label.equals("Darken"))
    ip.multiply(1.1);
   else if (label.equals("Rotate"))
    ip.rotate(30);
   else if (label.equals("Zoom In"))
    ip.scale(1.2, 1.2);
   else if (label.equals("Zoom Out"))
    ip.scale(0.8, 0.8);
   else if (label.equals("Threshsold"))
    ip.autoThreshold();
   else if (label.equals("Smooth"))
    ip.smooth();
   else if (label.equals("Sharpen"))
    ip.sharpen();
   else if (label.equals("Find Edges"))
    ip.findEdges();
   else if (label.equals("Macro 1"))
    macro1();
   else if (label.equals("Macro 2"))
    macro2();
   else if (label.equals("Add Noise"))
    ip.noise(20);
   img = ip.createImage();
   repaint();
   return true;
  }
  return false;
 }

 void updateAndDraw() {
  img.flush();
  img = ip.createImage();
  getGraphics().drawImage(img, 0, 0, this);
 }
 void macro1() {
  for (int i=10; i<=360; i+=10) {
   ip.reset();
   ip.rotate(i);
   updateAndDraw();
  }
 }

 void macro2() {
  double scale = 1, m = 1.2;
  for (int i=0; i<20; i++) {
   ip.reset();
   scale *= m;
   ip.scale(scale, scale);
   updateAndDraw();
  }
  for (int i=0; i <20; i++) {
   ip.reset();
   scale /= m;
   ip.scale(scale, scale);
   updateAndDraw();
  }
 }

}
修改後程式碼:(為了讓雜訊更為明顯,將20改成100)
import ij.*;
import java.applet.*;
import java.awt.*;
import ij.process.*;
/**Simple applet that demonstrates how to use ImageJ's ImageProcessor class.*/
public class IPDemo extends Applet {
 String name;
 Image img;
 ImageProcessor ip = null;
       
 public void init() {
  setLayout(new BorderLayout());
  Panel p = new Panel();
 /* p.setLayout(new GridLayout(5, 3));
  p.add(new Button("Reset"));
  p.add(new Button("Flip"));
  p.add(new Button("Invert"));
  p.add(new Button("Lighten"));
  p.add(new Button("Darken"));
  p.add(new Button("Rotate"));
  p.add(new Button("Zoom In"));
  p.add(new Button("Zoom Out"));
  p.add(new Button("Threshsold"));
  p.add(new Button("Smooth"));
  p.add(new Button("Sharpen"));
  p.add(new Button("Find Edges"));
  p.add(new Button("Macro 1"));
  p.add(new Button("Macro 2"));
 */
  add("South", p);
  name = getParameter("img");
  img = getImage(getDocumentBase(), name);
  MediaTracker tracker = new MediaTracker(this);
  tracker.addImage(img, 0);
  try {tracker.waitForID(0);}
  catch (InterruptedException e){}
  if (name.endsWith("jpg"))
   ip = new ColorProcessor(img);
  else
   ip = new ByteProcessor(img);
                        ip.noise(100);
   img = ip.createImage();
   repaint();
  ip.snapshot();
               
            
 }

 public void update(Graphics g) {
  paint(g);
 }
 public void paint(Graphics g) {
  g.drawImage(img, 0, 0, this);
 }
 public boolean action(Event e, Object arg) {
  if (e.target instanceof Button) {
   String label = (String)arg;
                          
                        if (label.equals("Reset"))
    ip.reset();
   else if (label.equals("Flip"))
    ip.flipVertical();
   else if (label.equals("Invert"))
    ip.invert();
   else if (label.equals("Lighten"))
    ip.multiply(1.1);
   else if (label.equals("Darken"))
    ip.multiply(0.9);
   else if (label.equals("Rotate"))
    ip.rotate(30);
   else if (label.equals("Zoom In"))
    ip.scale(1.2, 1.2);
   else if (label.equals("Zoom Out"))
    ip.scale(0.8, 0.8);
   else if (label.equals("Threshsold"))
    ip.autoThreshold();
   else if (label.equals("Smooth"))
    ip.smooth();
   else if (label.equals("Sharpen"))
    ip.sharpen();
   else if (label.equals("Find Edges"))
    ip.findEdges();
   else if (label.equals("Macro 1"))
    macro1();
   else if (label.equals("Macro 2"))
    macro2();
   
   img = ip.createImage();
   repaint();
   return true;
  }
  return false;
 }

 void updateAndDraw() {
       img.flush();
  img = ip.createImage();
  getGraphics().drawImage(img, 0, 0, this);
 }
 void macro1() {
  for (int i=10; i<=360; i+=10) {
   ip.reset();
   ip.rotate(i);
   updateAndDraw();
  }
 }

 void macro2() {
  double scale = 1, m = 1.2;
  for (int i=0; i<20; i++) {
   ip.reset();
   scale *= m;
   ip.scale(scale, scale);
   updateAndDraw();
  }
  for (int i=0; i <20; i++) {
   ip.reset();
   scale /= m;
   ip.scale(scale, scale);
   updateAndDraw();
  }
 }
}