Senin, 10 Desember 2018

EAS PBO
Membuat Image Editor

Nama = Chaniyah Zulfa Mukhlishah
NRP   = 05111740000115
Kelas = PBO-B

Soal =
  1. Gambarkan rancangan interfacenya.
  2. Gambarkan dan jelaskan Class Diagram penyusun dari image viewer yang akan dibuat.
  3. Implementasikan ke dalam program dan buat linknya.
Jawab =
  • Rancangan Interface
  • Class Diagram

      Explanation =
    1. ImageViewer: Sebagai Main Class. Image Viewer menampilkan GUI dan mengenalkan semua komponen lainnya. Seperti crop,text,rotate editor juga dimuat pada ImageViewer. Untuk menge-run pun kita membuat objek dari Class ini.
    2. ImageFileManager: Class untuk memuat dan menyimpan gambar dengan format gambar .jpg atau .png.
    3. ImagePanel: Komponen yang menampilkan OFImage. ImagePanel adalah subkelas JComponent dengan tambahan fungsi pengaturan OFImage yang akan ditampilkan pada permukaan komponen ini.
    4. OFImage: Mendefine gambar dalam format Objects First.
    5. Filter : Superclass abstrak untuk menampung semua filter gambar yang terdiri dari Darker,Treshold,Lighter,dan FishEye. Filter diterapkan ke OFImages.
    6. DarkerFilter: Filter untuk membuat gambar terlihat lebih gelap.
    7. TresholdFilter: Filter tingkat berbasis abu-abu.
    8. LighterFilter: Filter gambar untuk membuat gambar terlihat lebih terang.
    9. FishEyeFilter: Filter gambar untuk membuat efek mirip dengan lensa kamera mata ikan.
  • Program 
- Class ImageViewer


 import java.awt.*;  
 import java.awt.event.*;  
 import java.awt.image.*;  
 import javax.swing.*;  
 import javax.swing.border.*;  
 import java.io.File;  
 import java.util.List;  
 import java.util.ArrayList;  
 import java.util.Iterator;  
 /**   
  * Chaniyah Zulfa Mukhlishah   
  * 10-Des-18  
  */  
 public class ImageViewer  
 {  
   // static fields:  
   private static final String VERSION = "Version 3.0";  
   private static JFileChooser fileChooser = new JFileChooser(System.getProperty("user.dir"));  
   // fields:  
   private JFrame frame;  
   private ImagePanel imagePanel;  
   private JLabel filenameLabel;  
   private JLabel statusLabel;  
   private JButton smallerButton;  
   private JButton largerButton;  
   private OFImage currentImage;  
   private List<Filter> filters;  
   /**  
    * Create an ImageViewer and display its GUI on screen.  
    */  
   public ImageViewer()  
   {  
     currentImage = null;  
     filters = createFilters();  
     makeFrame();  
   }  
   // ---- implementation of menu functions ----  
   /**  
    * Open function: open a file chooser to select a new image file,  
    * and then display the chosen image.  
    */  
   private void openFile()  
   {  
     int returnVal = fileChooser.showOpenDialog(frame);   
     if(returnVal != JFileChooser.APPROVE_OPTION) {  
       return; // cancelled  
     }  
     File selectedFile = fileChooser.getSelectedFile();  
     currentImage = ImageFileManager.loadImage(selectedFile);  
     if(currentImage == null) {  // image file was not a valid image  
       JOptionPane.showMessageDialog(frame,  
           "The file was not in a recognized image file format.",  
           "Image Load Error",  
           JOptionPane.ERROR_MESSAGE);  
       return;  
     }  
     imagePanel.setImage(currentImage);  
     setButtonsEnabled(true);  
     showFilename(selectedFile.getPath());  
     showStatus("File loaded.");  
     frame.pack();  
   }  
   /**  
    * Close function: close the current image.  
    */  
   private void close()  
   {  
     currentImage = null;  
     imagePanel.clearImage();  
     showFilename(null);  
     setButtonsEnabled(false);  
   }  
   /**  
    * Save As function: save the current image to a file.  
    */  
   private void saveAs()  
   {  
     if(currentImage != null) {  
       int returnVal = fileChooser.showSaveDialog(frame);  
       if(returnVal != JFileChooser.APPROVE_OPTION) {  
         return; // cancelled  
       }  
       File selectedFile = fileChooser.getSelectedFile();  
       ImageFileManager.saveImage(currentImage, selectedFile);  
       showFilename(selectedFile.getPath());  
     }  
   }  
   /**  
    * Quit function: quit the application.  
    */  
   private void quit()  
   {  
     System.exit(0);  
   }  
   /**  
    * Apply a given filter to the current image.  
    *   
    * @param filter  The filter object to be applied.  
    */  
   private void applyFilter(Filter filter)  
   {  
     if(currentImage != null) {  
       filter.apply(currentImage);  
       frame.repaint();  
       showStatus("Applied: " + filter.getName());  
     }  
     else {  
       showStatus("No image loaded.");  
     }  
   }  
   /**  
    * 'About' function: show the 'about' box.  
    */  
   private void showAbout()  
   {  
     JOptionPane.showMessageDialog(frame,   
           "ImageViewer\n" + VERSION,  
           "About ImageViewer",   
           JOptionPane.INFORMATION_MESSAGE);  
   }  
   /**  
    * Make the current picture larger.  
    */  
   private void makeLarger()  
   {  
     if(currentImage != null) {  
       // create new image with double size  
       int width = currentImage.getWidth();  
       int height = currentImage.getHeight();  
       OFImage newImage = new OFImage(width * 2, height * 2);  
       // copy pixel data into new image  
       for(int y = 0; y < height; y++) {  
         for(int x = 0; x < width; x++) {  
           Color col = currentImage.getPixel(x, y);  
           newImage.setPixel(x * 2, y * 2, col);  
           newImage.setPixel(x * 2 + 1, y * 2, col);  
           newImage.setPixel(x * 2, y * 2 + 1, col);  
           newImage.setPixel(x * 2+1, y * 2 + 1, col);  
         }  
       }  
       currentImage = newImage;  
       imagePanel.setImage(currentImage);  
       frame.pack();  
     }  
   }  
   /**  
    * Make the current picture smaller.  
    */  
   private void makeSmaller()  
   {  
     if(currentImage != null) {  
       // create new image with double size  
       int width = currentImage.getWidth() / 2;  
       int height = currentImage.getHeight() / 2;  
       OFImage newImage = new OFImage(width, height);  
       // copy pixel data into new image  
       for(int y = 0; y < height; y++) {  
         for(int x = 0; x < width; x++) {  
           newImage.setPixel(x, y, currentImage.getPixel(x * 2, y * 2));  
         }  
       }  
       currentImage = newImage;  
       imagePanel.setImage(currentImage);  
       frame.pack();  
     }  
   }  
   private void makeCrop()  
   {  
     if (currentImage != null)  
     {  
       int width = currentImage.getWidth();  
       int height = currentImage.getWidth();  
       int xAwal = Integer.parseInt(JOptionPane.showInputDialog("xAwal"));  
       int yAwal = Integer.parseInt(JOptionPane.showInputDialog("yAwal"));  
       int xAkhir = Integer.parseInt(JOptionPane.showInputDialog("xAkhir"));  
       int yAkhir = Integer.parseInt(JOptionPane.showInputDialog("yAkhir"));  
       OFImage newImage = new OFImage(xAkhir - xAwal, yAkhir - yAwal);  
       for (int y = 0; y < yAkhir - yAwal; y++)  
       {  
         for (int x = 0; x < xAkhir - xAwal; x++)  
         {  
           newImage.setPixel(x, y, currentImage.getPixel(x + xAwal, y + yAwal));  
         }  
       }  
       currentImage = newImage;  
       imagePanel.setImage(currentImage);  
       frame.pack();  
     }  
   }  
   private void makeText()  
   {  
     JTextField xField = new JTextField(5);  
     JTextField yField = new JTextField(5);  
     JTextField zField = new JTextField(5);  
     JPanel myPanel = new JPanel();  
     myPanel.add(new JLabel("R"));  
     myPanel.add(xField);  
     myPanel.add(Box.createVerticalStrut(15)); // a spacer  
     myPanel.add(new JLabel("G"));  
     myPanel.add(yField);  
     myPanel.add(Box.createVerticalStrut(15)); // a spacer  
     myPanel.add(new JLabel("B"));  
     myPanel.add(zField);  
     if(currentImage != null) {  
       int width = currentImage.getWidth();  
       int height = currentImage.getHeight();  
       int xPosition = Integer.parseInt(JOptionPane.showInputDialog("Posisi X"));  
       int yPosition = Integer.parseInt(JOptionPane.showInputDialog("Posisi Y"));  
       float fontSize = Float.parseFloat(JOptionPane.showInputDialog("Ukuran font"));  
       String addText = JOptionPane.showInputDialog("Tuliskan sesuatu...");  
       int result = JOptionPane.showConfirmDialog(null, myPanel, "Warna font", JOptionPane.OK_CANCEL_OPTION);  
       OFImage newImage = new OFImage(width, height);  
       // copy pixel data into new image  
       for(int y = 0; y < height; y++) {  
         for(int x = 0; x < width; x++) {  
           Color col = currentImage.getPixel(x, y);  
           newImage.setPixel(x, y, col);  
         }  
       }  
       int r = Integer.parseInt(xField.getText());  
       int gr = Integer.parseInt(yField.getText());  
       int b = Integer.parseInt(zField.getText());  
       Color c = new Color(r,gr,b);  
       Graphics g = newImage.getGraphics();  
       g.setFont(g.getFont().deriveFont(fontSize));  
       g.setColor(c);  
       g.drawString(addText, xPosition, yPosition);  
       g.dispose();  
       currentImage = newImage;  
       imagePanel.setImage(currentImage);  
     }  
   }  
   private void Rotate180() {  
     if(currentImage != null) {  
       // create new image with double size  
       int width = currentImage.getWidth();  
       int height = currentImage.getHeight();  
       OFImage newImage = new OFImage(width, height);  
       //copy pixel data into new image  
       for(int y = 0; y < height; y++) {  
         for(int x = 0; x < width; x++) {  
           Color col = currentImage.getPixel(width-x-1, height-y-1);  
           newImage.setPixel(x, y, col);  
         }  
       }  
       currentImage = newImage;  
       imagePanel.setImage(currentImage);  
       frame.pack();  
     }  
   }  
   private void Rotate90left() {  
     if(currentImage != null) {  
       // create new image with double size  
       int width = currentImage.getWidth();  
       int height = currentImage.getHeight();  
       OFImage newImage = new OFImage(height, width);  
       //copy pixel data into new image  
       for(int y = 0; y < height; y++) {  
         for(int x = 0; x < width; x++) {  
           Color col = currentImage.getPixel(x, y);  
           newImage.setPixel(y, width-x-1, col);  
         }  
       }  
       currentImage = newImage;  
       imagePanel.setImage(currentImage);  
       frame.pack();  
     }  
   }  
   private void Rotate90right() {  
     if(currentImage != null) {  
       // create new image with double size  
       int width = currentImage.getWidth();  
       int height = currentImage.getHeight();  
       OFImage newImage = new OFImage(height, width);  
       //copy pixel data into new image  
       for(int y = 0; y < height; y++) {  
         for(int x = 0; x < width; x++) {  
           Color col = currentImage.getPixel(x, y);  
           newImage.setPixel(height-y-1, x, col);  
         }  
       }  
       currentImage = newImage;  
       imagePanel.setImage(currentImage);  
       frame.pack();  
     }  
   }  
   // ---- support methods ----  
   /**  
    * Show the file name of the current image in the fils display label.  
    * 'null' may be used as a parameter if no file is currently loaded.  
    *   
    * @param filename The file name to be displayed, or null for 'no file'.  
    */  
   private void showFilename(String filename)  
   {  
     if(filename == null) {  
       filenameLabel.setText("No file displayed.");  
     }  
     else {  
       filenameLabel.setText("File: " + filename);  
     }  
   }  
   /**  
    * Show a message in the status bar at the bottom of the screen.  
    * @param text The message to be displayed.  
    */  
   private void showStatus(String text)  
   {  
     statusLabel.setText(text);  
   }  
   /**  
    * Enable or disable all toolbar buttons.  
    *   
    * @param status 'true' to enable the buttons, 'false' to disable.  
    */  
   private void setButtonsEnabled(boolean status)  
   {  
     smallerButton.setEnabled(status);  
     largerButton.setEnabled(status);  
   }  
   /**  
    * Create a list with all the known filters.  
    * @return The list of filters.  
    */  
   private List<Filter> createFilters()  
   {  
     List<Filter> filterList = new ArrayList<Filter>();  
     filterList.add(new DarkerFilter("Darker"));  
     filterList.add(new LighterFilter("Lighter"));  
     filterList.add(new ThresholdFilter("Threshold"));  
     filterList.add(new FishEyeFilter("Fish Eye"));  
     return filterList;  
   }  
   // ---- swing stuff to build the frame and all its components ----  
   /**  
    * Create the Swing frame and its content.  
    */  
   private void makeFrame()  
   {  
     frame = new JFrame("ImageViewer");  
     JPanel contentPane = (JPanel)frame.getContentPane();  
     contentPane.setBorder(new EmptyBorder(6, 6, 6, 6));  
     makeMenuBar(frame);  
     // Specify the layout manager with nice spacing  
     contentPane.setLayout(new BorderLayout(6, 6));  
     // Create the image pane in the center  
     imagePanel = new ImagePanel();  
     imagePanel.setBorder(new EtchedBorder());  
     contentPane.add(imagePanel, BorderLayout.CENTER);  
     // Create two labels at top and bottom for the file name and status message  
     filenameLabel = new JLabel();  
     contentPane.add(filenameLabel, BorderLayout.NORTH);  
     statusLabel = new JLabel(VERSION);  
     contentPane.add(statusLabel, BorderLayout.SOUTH);  
     // Create the toolbar with the buttons  
     JPanel toolbar = new JPanel();  
     toolbar.setLayout(new GridLayout(0, 1));  
     smallerButton = new JButton("Smaller");  
     smallerButton.addActionListener(new ActionListener()   
     {  
       public void actionPerformed(ActionEvent e) { makeSmaller();}  
     });  
     toolbar.add(smallerButton);  
     largerButton = new JButton("Larger");  
     largerButton.addActionListener(new ActionListener()   
     {  
       public void actionPerformed(ActionEvent e) { makeLarger();}  
     });  
     toolbar.add(largerButton);  
     // Add toolbar into panel with flow layout for spacing  
     JPanel flow = new JPanel();  
     flow.add(toolbar);  
     contentPane.add(flow, BorderLayout.WEST);  
     // building is done - arrange the components     
     showFilename(null);  
     setButtonsEnabled(false);  
     frame.pack();  
     // place the frame at the center of the screen and show  
     Dimension d = Toolkit.getDefaultToolkit().getScreenSize();  
     frame.setLocation(d.width/2 - frame.getWidth()/2, d.height/2 - frame.getHeight()/2);  
     frame.setVisible(true);  
   }  
   /**  
    * Create the main frame's menu bar.  
    *   
    * @param frame  The frame that the menu bar should be added to.  
    */  
   private void makeMenuBar(JFrame frame)  
   {  
     final int SHORTCUT_MASK =  
       Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();  
     JMenuBar menubar = new JMenuBar();  
     frame.setJMenuBar(menubar);  
     JMenu menu;  
     JMenuItem item;  
     // create the File menu  
     menu = new JMenu("File");  
     menubar.add(menu);  
     item = new JMenuItem("Open...");  
       item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, SHORTCUT_MASK));  
       item.addActionListener(new ActionListener() {  
                 public void actionPerformed(ActionEvent e) { openFile(); }  
               });  
     menu.add(item);  
     item = new JMenuItem("Close");  
       item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, SHORTCUT_MASK));  
       item.addActionListener(new ActionListener() {  
                 public void actionPerformed(ActionEvent e) { close(); }  
               });  
     menu.add(item);  
     menu.addSeparator();  
     item = new JMenuItem("Save As...");  
       item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, SHORTCUT_MASK));  
       item.addActionListener(new ActionListener() {  
                 public void actionPerformed(ActionEvent e) { saveAs(); }  
               });  
     menu.add(item);  
     menu.addSeparator();  
     item = new JMenuItem("Quit");  
       item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, SHORTCUT_MASK));  
       item.addActionListener(new ActionListener() {  
                 public void actionPerformed(ActionEvent e) { quit(); }  
               });  
     menu.add(item);  
     // create the Filter menu  
     menu = new JMenu("Filter");  
     menubar.add(menu);  
     for(final Filter filter : filters) {  
       item = new JMenuItem(filter.getName());  
       item.addActionListener(new ActionListener() {  
                 public void actionPerformed(ActionEvent e) {   
                   applyFilter(filter);  
                 }  
               });  
        menu.add(item);  
      }  
     menu = new JMenu("Crop");  
     menubar.add(menu);  
     item = new JMenuItem("Crop Image");  
       item.addActionListener(new ActionListener()   
       {  
         public void actionPerformed(ActionEvent e) { makeCrop(); }  
       });  
     menu.add(item);  
     menu = new JMenu("Text");  
     menubar.add(menu);  
     item = new JMenuItem("Add Text");  
       item.addActionListener(new ActionListener()   
       {  
       public void actionPerformed(ActionEvent e) { makeText(); }  
     });  
     menu.add(item);  
     menu = new JMenu("Rotate");  
     menubar.add(menu);  
     item = new JMenuItem("Rotate 180");  
       item.addActionListener(new ActionListener() {  
                 public void actionPerformed(ActionEvent e) { Rotate180(); }  
               });  
     menu.add(item);  
     item = new JMenuItem("Rotate 90 Left");  
       item.addActionListener(new ActionListener() {  
                 public void actionPerformed(ActionEvent e) { Rotate90left(); }  
               });  
     menu.add(item);  
     item = new JMenuItem("Rotate 90 Right");  
       item.addActionListener(new ActionListener() {  
                 public void actionPerformed(ActionEvent e) { Rotate90right(); }  
               });  
     menu.add(item);  
     // create the Help menu  
     menu = new JMenu("Help");  
     menubar.add(menu);  
     item = new JMenuItem("About ImageViewer...");  
       item.addActionListener(new ActionListener() {  
                 public void actionPerformed(ActionEvent e) { showAbout(); }  
               });  
     menu.add(item);  
   }  
 }  


- Class ImageFileManager

  import java.awt.image.*;   
  import javax.imageio.*;   
  import java.io.*;   
  /**   
  * Chaniyah Zulfa Mukhlishah   
  * 10-Des-18  
  */   
  public class ImageFileManager   
  {   
   // A constant for the image format that this writer uses for writing.   
   // Available formats are "jpg" and "png".   
   private static final String IMAGE_FORMAT = "jpg";   
   /**   
   * Read an image file from disk and return it as an image. This method   
   * can read JPG and PNG file formats. In case of any problem (e.g the file    
   * does not exist, is in an undecodable format, or any other read error)    
   * this method returns null.   
   *    
   * @param imageFile The image file to be loaded.   
   * @return   The image object or null is it could not be read.   
   */   
   public static OFImage loadImage(File imageFile)   
   {   
    try {   
     BufferedImage image = ImageIO.read(imageFile);   
     if(image == null || (image.getWidth(null) < 0)) {   
      // we could not load the image - probably invalid file format   
      return null;   
     }   
     return new OFImage(image);   
    }   
    catch(IOException exc) {   
     return null;   
    }   
   }   
   /**   
   * Write an image file to disk. The file format is JPG. In case of any    
   * problem the method just silently returns.   
   *    
   * @param image The image to be saved.   
   * @param file The file to save to.   
   */   
   public static void saveImage(OFImage image, File file)   
   {   
    try {   
     ImageIO.write(image, IMAGE_FORMAT, file);   
    }   
    catch(IOException exc) {   
     return;   
    }   
   }   
  }   

- Class ImagePlanel


 import java.awt.*;   
  import javax.swing.*;   
  import java.awt.image.*;   
  /**   
  * Chaniyah Zulfa Mukhlishah   
  * 10-Des-18  
  */    
  public class ImagePanel extends JComponent   
  {   
   // The current width and height of this panel   
   private int width, height;   
   // An internal image buffer that is used for painting. For   
   // actual display, this image buffer is then copied to screen.   
   private OFImage panelImage;   
   /**   
   * Create a new, empty ImagePanel.   
   */   
   public ImagePanel()   
   {   
    width = 360; // arbitrary size for empty panel   
    height = 240;   
    panelImage = null;   
   }   
   /**   
   * Set the image that this panel should show.   
   *    
   * @param image The image to be displayed.   
   */   
   public void setImage(OFImage image)   
   {   
    if(image != null) {   
     width = image.getWidth();   
     height = image.getHeight();   
     panelImage = image;   
     repaint();   
    }   
   }   
   /**   
   * Clear the image on this panel.   
   */   
   public void clearImage()   
   {   
    Graphics imageGraphics = panelImage.getGraphics();   
    imageGraphics.setColor(Color.LIGHT_GRAY);   
    imageGraphics.fillRect(0, 0, width, height);   
    repaint();   
   }   
   // The following methods are redefinitions of methods   
   // inherited from superclasses.   
   /**   
   * Tell the layout manager how big we would like to be.   
   * (This method gets called by layout managers for placing   
   * the components.)   
   *    
   * @return The preferred dimension for this component.   
   */   
   public Dimension getPreferredSize()   
   {   
    return new Dimension(width, height);   
   }   
   /**   
   * This component needs to be redisplayed. Copy the internal image    
   * to screen. (This method gets called by the Swing screen painter    
   * every time it want this component displayed.)   
   *    
   * @param g The graphics context that can be used to draw on this component.   
   */   
   public void paintComponent(Graphics g)   
   {   
    Dimension size = getSize();   
    g.clearRect(0, 0, size.width, size.height);   
    if(panelImage != null) {   
     g.drawImage(panelImage, 0, 0, null);   
    }   
   }   
  }   

- Class OFImage


 import java.awt.*;   
  import java.awt.image.*;   
  import javax.swing.*;   
  /**   
  * Chaniyah Zulfa Mukhlishah   
  * 10-Des-18  
  */    
  public class OFImage extends BufferedImage   
  {   
   /**   
   * Create an OFImage copied from a BufferedImage.   
   * @param image The image to copy.   
   */   
   public OFImage(BufferedImage image)   
   {   
    super(image.getColorModel(), image.copyData(null),    
      image.isAlphaPremultiplied(), null);   
   }   
   /**   
   * Create an OFImage with specified size and unspecified content.   
   * @param width The width of the image.   
   * @param height The height of the image.   
   */   
   public OFImage(int width, int height)   
   {   
    super(width, height, TYPE_INT_RGB);   
   }   
   /**   
   * Set a given pixel of this image to a specified color. The   
   * color is represented as an (r,g,b) value.   
   * @param x The x position of the pixel.   
   * @param y The y position of the pixel.   
   * @param col The color of the pixel.   
   */   
   public void setPixel(int x, int y, Color col)   
   {   
    int pixel = col.getRGB();   
    setRGB(x, y, pixel);   
   }   
   /**   
   * Get the color value at a specified pixel position.   
   * @param x The x position of the pixel.   
   * @param y The y position of the pixel.   
   * @return The color of the pixel at the given position.   
   */   
   public Color getPixel(int x, int y)   
   {   
    int pixel = getRGB(x, y);   
    return new Color(pixel);   
   }   
  }  


- Class Filter


  /**   
  * Chaniyah Zulfa Mukhlishah   
  * 10-Des-18  
  */    
  public abstract class Filter   
  {   
   private String name;   
   /**   
   * Create a new filter with a given name.   
   * @param name The name of the filter.   
   */   
   public Filter(String name)   
   {   
    this.name = name;   
   }   
   /**   
   * Return the name of this filter.   
   *    
   * @return The name of this filter.   
   */   
   public String getName()   
   {   
    return name;   
   }   
   /**   
   * Apply this filter to an image.   
   *    
   * @param image The image to be changed by this filter.   
   */   
   public abstract void apply(OFImage image);   
  }   


- Class LighterFilter


 /**   
  * Chaniyah Zulfa Mukhlishah   
  * 10-Des-18  
  */   
  public class LighterFilter extends Filter   
  {   
    /**   
     * Constructor for objects of class LighterFilter.   
   * @param name The name of the filter.   
     */   
    public LighterFilter(String name)   
   {   
    super(name);   
    }   
   /**   
   * Apply this filter to an image.   
   *    
   * @param image The image to be changed by this filter.   
   */   
   public void apply(OFImage image)   
   {   
    int height = image.getHeight();   
    int width = image.getWidth();   
    for(int y = 0; y < height; y++) {   
     for(int x = 0; x < width; x++) {   
      image.setPixel(x, y, image.getPixel(x, y).brighter());   
     }   
    }   
   }   
  }   

- Class FishEyeFilter


  import java.awt.Color;   
  /**   
  * Chaniyah Zulfa Mukhlishah   
  * 10-Des-18  
  */   
  public class FishEyeFilter extends Filter   
  {   
   // constants:   
   private final static int SCALE = 20; // this defines the strenght of the filter   
   private final static double TWO_PI = 2 * Math.PI;   
   /**   
   * Constructor for objects of class LensFilter.   
   * @param name The name of the filter.   
   */   
   public FishEyeFilter(String name)   
   {   
    super(name);   
   }   
   /**   
   * Apply this filter to an image.   
   *    
   * @param image The image to be changed by this filter.   
   */   
   public void apply(OFImage image)   
   {   
    int height = image.getHeight();   
    int width = image.getWidth();   
    OFImage original = new OFImage(image);   
    int[] xa = computeXArray(width);   
    int[] ya = computeYArray(height);   
    for(int y = 0; y < height; y++) {   
     for(int x = 0; x < width; x++) {   
      image.setPixel(x, y, original.getPixel(x + xa[x], y + ya[y]));   
     }   
    }   
   }   
   /**   
   * Compute and return an array of horizontal offsets for each pixel column.   
   * These can then be applied as the horizontal offset for each pixel.   
   */   
   private int[] computeXArray(int width)   
   {   
    int[] xArray = new int[width];   
    for(int i=0; i < width; i++) {   
     xArray[i] = (int)(Math.sin( ((double)i / width) * TWO_PI) * SCALE);   
    }   
    return xArray;   
   }   
   /**   
   * Compute and return an array of vertical offsets for each pixel row.   
   * These can then be applied as the vertical offset for each pixel.   
   */   
   private int[] computeYArray(int height)   
   {   
    int[] yArray = new int[height];   
    for(int i=0; i < height; i++) {   
     yArray[i] = (int)(Math.sin( ((double)i / height) * TWO_PI) * SCALE);   
    }   
    return yArray;   
   }   
  }   

- Class ThresholdFilter


 import java.awt.Color;   
  /**   
  * Chaniyah Zulfa Mukhlishah   
  * 10-Des-18  
  */    
  public class ThresholdFilter extends Filter   
  {   
    /**   
     * Constructor for objects of class ThresholdFilter.   
   * @param name The name of the filter.   
     */   
    public ThresholdFilter(String name)   
   {   
    super(name);   
    }   
   /**   
   * Apply this filter to an image.   
   *    
   * @param image The image to be changed by this filter.   
   */   
   public void apply(OFImage image)   
   {   
    int height = image.getHeight();   
    int width = image.getWidth();   
    for(int y = 0; y < height; y++) {   
     for(int x = 0; x < width; x++) {   
      Color pixel = image.getPixel(x, y);   
      int brightness = (pixel.getRed() + pixel.getBlue() + pixel.getGreen()) / 3;   
      if(brightness <= 85) {   
       image.setPixel(x, y, Color.BLACK);   
      }   
      else if(brightness <= 170) {   
       image.setPixel(x, y, Color.GRAY);   
      }   
      else {   
       image.setPixel(x, y, Color.WHITE);   
      }   
     }   
    }   
   }   
  }   

- Class DarkFilter



 /**   
  * Chaniyah Zulfa Mukhlishah   
  * 10-Des-18  
  */   
  public class DarkerFilter extends Filter   
  {   
   /**   
   * Constructor for objects of class DarkerFilter.   
   * @param name The name of the filter.   
   */   
   public DarkerFilter(String name)   
   {   
    super(name);   
   }   
   /**   
   * Apply this filter to an image.   
   *    
   * @param image The image to be changed by this filter.   
   */   
   public void apply(OFImage image)   
   {   
    int height = image.getHeight();   
    int width = image.getWidth();   
    for(int y = 0; y < height; y++) {   
     for(int x = 0; x < width; x++) {   
      image.setPixel(x, y, image.getPixel(x, y).darker());   
     }   
    }   
   }   
  }   

Thanks All, semoga bermanfaat :))

Minggu, 02 Desember 2018

GAME PONG
Nama = Chaniyah Zulfa Mukhlishah
NRP   = 05111740000115

Tugas kali ini adalah membuat game pong dari blueJ, yang membutuhkan 4 Class, yaitu =
1.  Ball
2. Paddle
3. Renderer
4. Pong

Source Code untuk tiap class adalah sebagai berikut :
1.) Class Ball

 /**  
  * @author Chaniyah Zulfa Mukhlishah  
  * @version 03-Dec-18  
  */  
 import java.awt.Color;   
  import java.awt.Graphics;   
  import java.util.Random;   
  public class Ball   
  {   
   public int x, y, width = 25, height = 25;   
   public int motionX, motionY;   
   public Random random;   
   private Pong pong;   
   public int amountOfHits;   
   public Ball(Pong pong)   
    {   
       this.pong = pong;   
       this.random = new Random();   
       spawn();   
    }   
    public void update(Paddle paddle1, Paddle paddle2)   
    {   
       int speed = 5;   
       this.x += motionX * speed;   
       this.y += motionY * speed;   
       if (this.y + height - motionY > pong.height || this.y + motionY < 0)   
       {   
         if (this.motionY < 0)   
         {   
            this.y = 0;   
            this.motionY = random.nextInt(4);   
            if (motionY == 0)   
            {   
              motionY = 1;   
            }   
         }   
         else   
         {   
            this.motionY = -random.nextInt(4);   
            this.y = pong.height - height;   
            if (motionY == 0)   
            {   
              motionY = -1;   
            }   
         }   
       }   
       if (checkCollision(paddle1) == 1)   
       {   
         this.motionX = 1 + (amountOfHits / 5);   
         this.motionY = -2 + random.nextInt(4);   
         if (motionY == 0)   
         {   
            motionY = 1;   
         }   
         amountOfHits++;   
       }   
       else if (checkCollision(paddle2) == 1)   
       {   
         this.motionX = -1 - (amountOfHits / 5);   
         this.motionY = -2 + random.nextInt(4);   
         if (motionY == 0)   
         {   
            motionY = 1;   
         }   
         amountOfHits++;   
       }   
       if (checkCollision(paddle1) == 2)   
       {   
         paddle2.score++;   
         spawn();   
       }   
       else if (checkCollision(paddle2) == 2)   
       {   
         paddle1.score++;   
         spawn();   
       }   
    }   
    public void spawn()   
    {   
       this.amountOfHits = 0;   
       this.x = pong.width / 2 - this.width / 2;   
       this.y = pong.height / 2 - this.height / 2;   
       this.motionY = -2 + random.nextInt(4);   
       if (motionY == 0)   
       {   
         motionY = 1;   
       }   
       if (random.nextBoolean())   
       {   
         motionX = 1;   
       }   
       else   
       {   
         motionX = -1;   
       }   
    }   
    public int checkCollision(Paddle paddle)   
    {   
       if (this.x < paddle.x + paddle.width && this.x + width > paddle.x && this.y < paddle.y + paddle.height && this.y + height > paddle.y)   
       {   
         return 1; //bounce   
       }   
       else if ((paddle.x > x && paddle.paddleNumber == 1) || (paddle.x < x - width && paddle.paddleNumber == 2))   
       {   
         return 2; //score   
       }   
       return 0;    
    }   
    public void render(Graphics g)   
    {   
       g.setColor(Color.WHITE);   
       g.fillOval(x, y, width, height);   
    }   
  }   

2.) Class Paddle

 /**  
  * @author Chaniyah Zulfa Mukhlishah  
  * @version 03-Dec-18  
  */  
 import java.awt.Color;   
  import java.awt.Graphics;   
  public class Paddle   
  {   
   public int paddleNumber;   
   public int x, y, width = 50, height = 250;   
   public int score;   
   public Paddle(Pong pong, int paddleNumber) {   
    this.paddleNumber = paddleNumber;   
    if (paddleNumber == 1) {   
     this.x = 0;   
    }   
    if (paddleNumber == 2) {   
     this.x = pong.width - width;   
    }   
    this.y = pong.height / 2 - this.height / 2;   
   }   
   public void render(Graphics g) {   
    g.setColor(Color.WHITE);   
    g.fillRect(x, y, width, height);   
   }   
   public void move(boolean up) {   
    int speed = 15;   
    if (up) {   
     if (y - speed > 0) {   
      y -= speed;   
     } else {   
      y = 0;   
     }   
    } else {   
     if (y + height + speed < Pong.pong.height) {   
      y += speed;   
     } else {   
      y = Pong.pong.height - height;   
     }   
    }   
   }   
  }   

3.) Class Renderer

 /**  
  * @author Chaniyah Zulfa Mukhlishah  
  * @version 03-Dec-18  
  */  
 import java.awt.Graphics;   
  import java.awt.Graphics2D;   
  import javax.swing.JPanel;   
  public class Renderer extends JPanel   
  {   
   private static final long serialVersionUID = 1L;   
   @Override   
   protected void paintComponent(Graphics g) {   
    super.paintComponent(g);   
    Pong.pong.render((Graphics2D) g);   
   }   
  }   

4.) Class Pong

 /**  
  * @author Chaniyah Zulfa Mukhlishah  
  * @version 03-Dec-18  
  */  
  import java.awt.BasicStroke;   
  import java.awt.Color;   
  import java.awt.Font;   
  import java.awt.Graphics2D;   
  import java.awt.RenderingHints;   
  import java.awt.event.ActionEvent;   
  import java.awt.event.ActionListener;   
  import java.awt.event.KeyEvent;   
  import java.awt.event.KeyListener;   
  import java.util.Random;   
  import javax.swing.JFrame;   
  import javax.swing.Timer;   
  public class Pong implements ActionListener, KeyListener   
  {   
   public static Pong pong;   
    public int width = 700, height = 700;   
    public Renderer renderer;   
    public Paddle player1;   
    public Paddle player2;   
    public Ball ball;   
    public boolean bot = false, selectingDifficulty;   
    public boolean w, s, up, down;   
    public int gameStatus = 0, scoreLimit = 7, playerWon;    
    //0 = Menu, 1 = Paused, 2 = Playing, 3 = Over   
    public int botDifficulty, botMoves, botCooldown = 0;   
    public Random random;   
    public JFrame jframe;   
    public Pong()   
    {   
       Timer timer = new Timer(20, this);   
       random = new Random();   
       jframe = new JFrame("Pong");   
       renderer = new Renderer();   
       jframe.setSize(width + 15, height + 35);   
       jframe.setVisible(true);   
       jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
       jframe.add(renderer);   
       jframe.addKeyListener(this);   
       timer.start();   
    }   
    public void start()   
    {   
     gameStatus = 2;   
     player1 = new Paddle(this, 1);   
     player2 = new Paddle(this, 2);   
     ball = new Ball(this);   
    }   
    public void update()   
    {   
       if (player1.score >= scoreLimit)   
       {   
         playerWon = 1;   
         gameStatus = 3;   
       }   
       if (player2.score >= scoreLimit)   
       {   
         gameStatus = 3;   
         playerWon = 2;   
       }   
       if (w)   
       {   
         player1.move(true);   
       }   
       if (s)   
       {   
         player1.move(false);   
       }   
       if (!bot)   
       {   
         if (up)   
         {   
            player2.move(true);   
         }   
         if (down)   
         {   
            player2.move(false);   
         }   
       }   
       else   
       {   
         if (botCooldown > 0)   
         {   
            botCooldown--;   
            if (botCooldown == 0)   
            {   
              botMoves = 0;   
            }   
         }   
         if (botMoves < 10)   
         {   
            if (player2.y + player2.height / 2 < ball.y)   
            {   
              player2.move(false);   
              botMoves++;   
            }   
            if (player2.y + player2.height / 2 > ball.y)   
            {   
              player2.move(true);   
              botMoves++;   
            }   
            if (botDifficulty == 0)   
            {   
              botCooldown = 1;   
            }   
            if (botDifficulty == 1)   
            {   
              botCooldown = 15;   
            }   
            if (botDifficulty == 2)   
            {   
              botCooldown = 10;   
            }   
         }   
       }   
       ball.update(player1, player2);   
    }   
    public void render(Graphics2D g)   
    {   
       g.setColor(Color.BLACK);   
       g.fillRect(0, 0, width, height);   
       g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);   
       if (gameStatus == 0)   
       {   
         g.setColor(Color.WHITE);   
         g.setFont(new Font("Arial", 1, 50));   
         g.drawString("PONG", width / 2 - 75, 50);   
         if (!selectingDifficulty)   
         {   
            g.setFont(new Font("Arial", 1, 30));   
            g.drawString("Press Space to Play", width / 2 - 150, height / 2 - 25);   
            g.drawString("Press Shift to Play with Bot", width / 2 - 200, height / 2 + 25);   
            g.drawString("<< Score Limit: " + scoreLimit + " >>", width / 2 - 150, height / 2 + 75);   
         }   
       }   
       if (selectingDifficulty)   
       {   
         String string = botDifficulty == 0 ? "Easy" : (botDifficulty == 1 ? "Medium" : "Hard");   
         g.setFont(new Font("Arial", 1, 30));   
         g.drawString("<< Bot Difficulty: " + string + " >>", width / 2 - 180, height / 2 - 25);   
         g.drawString("Press Space to Play", width / 2 - 150, height / 2 + 25);   
       }   
       if (gameStatus == 1)   
       {   
         g.setColor(Color.WHITE);   
         g.setFont(new Font("Arial", 1, 50));   
         g.drawString("PAUSED", width / 2 - 103, height / 2 - 25);   
       }   
       if (gameStatus == 1 || gameStatus == 2)   
       {   
         g.setColor(Color.WHITE);   
         g.setStroke(new BasicStroke(5f));   
         g.drawLine(width / 2, 0, width / 2, height);   
         g.setStroke(new BasicStroke(2f));   
         g.drawOval(width / 2 - 150, height / 2 - 150, 300, 300);   
         g.setFont(new Font("Arial", 1, 50));   
         g.drawString(String.valueOf(player1.score), width / 2 - 90, 50);   
         g.drawString(String.valueOf(player2.score), width / 2 + 65, 50);   
         player1.render(g);   
         player2.render(g);   
         ball.render(g);   
       }   
       if (gameStatus == 3)   
       {   
         g.setColor(Color.WHITE);   
         g.setFont(new Font("Arial", 1, 50));   
         g.drawString("PONG", width / 2 - 75, 50);   
         if (bot && playerWon == 2)   
         {   
            g.drawString("The Bot Wins!", width / 2 - 170, 200);   
         }   
         else   
         {   
            g.drawString("Player " + playerWon + " Wins!", width / 2 - 165, 200);   
         }   
         g.setFont(new Font("Arial", 1, 30));   
         g.drawString("Press Space to Play Again", width / 2 - 185, height / 2 - 25);   
         g.drawString("Press ESC for Menu", width / 2 - 140, height / 2 + 25);   
       }   
    }   
    @Override   
    public void actionPerformed(ActionEvent e)   
    {   
       if (gameStatus == 2)   
       {   
         update();   
       }   
       renderer.repaint();   
    }   
    public static void main(String[] args)   
    {   
       pong = new Pong();   
    }   
    @Override   
    public void keyPressed(KeyEvent e)   
    {   
       int id = e.getKeyCode();   
       if (id == KeyEvent.VK_W)   
       {   
         w = true;   
       }   
       else if (id == KeyEvent.VK_S)   
       {   
         s = true;   
       }   
       else if (id == KeyEvent.VK_UP)   
       {   
         up = true;   
       }   
       else if (id == KeyEvent.VK_DOWN)   
       {   
         down = true;   
       }   
       else if (id == KeyEvent.VK_RIGHT)   
       {   
         if (selectingDifficulty)   
         {   
            if (botDifficulty < 2)   
            {   
              botDifficulty++;   
            }   
            else   
            {   
              botDifficulty = 0;   
            }   
         }   
         else if (gameStatus == 0)   
         {   
            scoreLimit++;   
         }   
       }   
       else if (id == KeyEvent.VK_LEFT)   
       {   
         if (selectingDifficulty)   
         {   
            if (botDifficulty > 0)   
            {   
              botDifficulty--;   
            }   
            else   
            {   
              botDifficulty = 2;   
            }   
         }   
         else if (gameStatus == 0 && scoreLimit > 1)   
         {   
            scoreLimit--;   
         }   
       }   
       else if (id == KeyEvent.VK_ESCAPE && (gameStatus == 2 || gameStatus == 3))   
       {   
         gameStatus = 0;   
       }   
       else if (id == KeyEvent.VK_SHIFT && gameStatus == 0)   
       {   
         bot = true;   
         selectingDifficulty = true;   
       }   
       else if (id == KeyEvent.VK_SPACE)   
       {   
         if (gameStatus == 0 || gameStatus == 3)   
         {   
            if (!selectingDifficulty)   
            {   
              bot = false;   
            }   
            else   
            {   
              selectingDifficulty = false;   
            }   
            start();   
         }   
         else if (gameStatus == 1)   
         {   
            gameStatus = 2;   
         }   
         else if (gameStatus == 2)   
         {   
            gameStatus = 1;   
         }   
       }   
    }   
    @Override   
    public void keyReleased(KeyEvent e)   
    {   
       int id = e.getKeyCode();   
       if (id == KeyEvent.VK_W)   
       {   
         w = false;   
       }   
       else if (id == KeyEvent.VK_S)   
       {   
         s = false;   
       }   
       else if (id == KeyEvent.VK_UP)   
       {   
         up = false;   
       }   
       else if (id == KeyEvent.VK_DOWN)   
       {   
         down = false;   
       }   
    }   
    @Override   
    public void keyTyped(KeyEvent e)   
    {   
    }   
  }   

Running =


Pertama, run pada Class pong
----------------------------------------------------------------------------------------


Untuk bermain dengan bot, klik "Shift" pada keyboard
------------------------------------------------------------------------------------------


Pilihlah level dari Easy, Medium, atau Hard sesuai selera
------------------------------------------------------------------------------------------------


Untuk menggeser penangkap bola klik S(kebawah) dan W(keatas)
---------------------------------------------------------------------------------------------------


Hasil keluar jika salah satu poin = 7
--------------------------------------------------------------------------------------------- 

Thanks all :) Semoga bermanfaat !!