Tugas 7 PBO - Image Viewer

 Muhammad Izzuddin Al Islami

05111740000035 


Deskripsi

Sebuah progam GUI (Graphical User Interface) dari buku Object First With Java. Program ini dapat menampilkan file citra dari komputer pengguna ke dalam canvas. Pengguna juga dapat menambahkan filter ke citra yang ada pada canvas aplikasi.

Class Diagram




Dekronstruksi Module/Class yang dibutuhkan

Aplikasi Image Viewer memerlukan beberapa modul sebagai berikut:

  1. Javax.swing (Library Java untuk mengembangkan aplikasi GUI )
  2. Java.awt (Library GUI Java, menyediakan layout dan kelas-kelas graphical untuk Javax.swing)
  3. Java.awt.event (Library GUI Java untuk menghandle event dari aplikasi GUI) 
  4. Java.awt.image (Library GUI Java untuk menghandle dan mengubah image) 
  5. Javax.imageio (Library Java untuk menyimpan dan membuka file citra) 
  6. Java.io (Library Java untuk  melkukan operasi terhadap file)
  7. OFImage (Class untuk melakukan transformasi citra dengan 3 filter: darken, lighten, dan threshold)
  8. ImageFileManager (Class yang menghandle operasi membuka file citra dari komputer pengguna)
  9. ImagePanel (Class untuk menampilkan citra, merupakan komponen dari aplikasi GUI)
  10. ImageViewer (Class utama, berisi komponen-komponen GUI)

Implementasi (Source Code)

  1. OFImage.java
  2.  import java.awt.*;  
     import java.awt.image.*;  
     import javax.swing.*;  
     public class OFImage extends BufferedImage  
     {  
       public OFImage(BufferedImage image){  
         super(image.getColorModel(), image.copyData(null), image.isAlphaPremultiplied(),null);      
       }  
       public OFImage (int width, int height){  
         super(width, height,TYPE_INT_RGB);  
       }  
       public void setPixel(int x, int y, Color warna){  
         int pixel = warna.getRGB();  
         setRGB(x,y,pixel);  
       }  
       public Color getPixel(int x, int y){  
         int pixel = getRGB(x,y);  
         return new Color(pixel);  
       }  
       public void darker(){  
         int height = getHeight();  
         int width= getWidth();  
         for(int i=0; i<height; i++){  
           for(int j =0; j<width; j++){  
             setPixel(j,i, getPixel(j,i).darker());  
           }  
         }  
       }  
       public void lighter(){  
         int height = getHeight();  
         int width = getWidth();  
         for(int i =0; i<height; i++){  
           for(int j=0; j<width; j++){  
             setPixel(j,i,getPixel(j,i).brighter());  
           }  
         }  
       }  
       public void threshold(){  
         int height = getHeight();  
         int width = getWidth();  
         for(int i =0; i<height; i++){  
           for(int j=0; j<width; j++){  
             Color pixel = getPixel(j,i);  
             int brightness =(pixel.getRed() + pixel.getBlue() + pixel.getGreen())/3;  
             if(brightness <= 85){  
               setPixel(j,i, Color.BLACK);  
             }  
             else if(brightness <= 85*2){  
               setPixel(j,i, Color.GRAY);  
             }  
             else{  
               setPixel(j,i, Color.WHITE);  
             }  
           }  
         }  
       }  
     }  
    
  3. ImageFileManager,java
  4.  import java.awt.image.*;  
     import javax.imageio.*;  
     import java.io.*;  
     import java.util.*;  
     public class ImageFileManager  
     {  
       private static final String IMAGE_FORMAT = "jpg";  
       public static OFImage loadImage(File imageFile){  
         try{  
           BufferedImage image = ImageIO.read(imageFile);  
           if(image == null || image.getWidth(null) < 0){  
             return null;  
           }  
           return new OFImage(image);  
         }  
         catch(IOException exc){  
           return null;  
         }  
       }  
       public static void saveImage(OFImage image, File file)  
       {  
         try{  
           ImageIO.write(image, IMAGE_FORMAT, file);  
         }  
         catch(IOException exc){  
           return;  
         }  
       }  
     }  
    
  5. ImagePanel.java
  6.  import java.awt.*;  
     import javax.swing.*;  
     import java.awt.image.*;  
     public class ImagePanel extends JComponent  
     {  
       private int width, height;  
       private OFImage panelImage;  
       public ImagePanel(){  
         width = 360;  
         height = 240;  
         panelImage = null;  
       }  
       public void setImage(OFImage image){  
         if(image!= null){  
           width = image.getWidth();  
           height = image.getHeight();  
           panelImage = image;  
           repaint();  
         }  
       }  
       public void clearImage()  
       {  
         Graphics imageGraphics = panelImage.getGraphics();  
         imageGraphics.setColor(Color.LIGHT_GRAY);  
         imageGraphics.fillRect(0,0,width,height);  
         repaint();  
       }  
       public Dimension getPreferredSize(){  
         return new Dimension(width,height);  
       }  
       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);  
         }  
       }  
     }  
    
  7. ImageViewer.java
  8.  import java.awt.*;   
     import java.awt.event.*;   
     import java.awt.image.*;   
     import javax.swing.*;   
     import java.io.File;  
     public class ImageViewer   
     {   
       private static final String VERSION = "Version 1.0";   
       private static JFileChooser fileChooser = new JFileChooser(System.getProperty("user.dir"));   
       private JFrame frame;   
       private ImagePanel imagePanel;   
       private JLabel filenameLabel;   
       private JLabel statusLabel;   
       private OFImage currentImage;   
       public ImageViewer()   
       {   
         currentImage = null;   
         makeFrame();   
       }  
       private void openFile()   
       {   
         int returnVal = fileChooser.showOpenDialog(frame);   
         if(returnVal != JFileChooser.APPROVE_OPTION) {   
           return;  
         }   
         File selectedFile = fileChooser.getSelectedFile();   
         currentImage = ImageFileManager.loadImage(selectedFile);   
         if(currentImage == null){   
           JOptionPane.showMessageDialog(frame, "The file was not in a recognized image file format.","Image Load Error", JOptionPane.ERROR_MESSAGE);   
           return;   
         }   
         imagePanel.setImage(currentImage);   
         showFilename(selectedFile.getPath());   
         showStatus("File loaded.");   
         frame.pack();   
       }   
       private void close()   
       {   
         currentImage = null;   
         imagePanel.clearImage();   
         showFilename(null);   
       }   
       private void quit()   
       {   
         System.exit(0);   
       }   
       private void makeDarker()   
       {   
         if(currentImage != null){   
         currentImage.darker();   
         frame.repaint();   
         showStatus("Applied: darker");   
         }   
         else{   
           showStatus("No image loaded.");   
         }   
       }   
       private void makeLighter()   
       {   
         if(currentImage != null) {   
           currentImage.lighter();   
           frame.repaint();   
           showStatus("Applied: lighter");   
         }   
         else {   
           showStatus("No image loaded.");   
         }   
       }   
       private void threshold()   
       {   
         if(currentImage != null) {   
           currentImage.threshold();   
           frame.repaint();   
           showStatus("Applied: threshold");   
         }   
         else {   
           showStatus("No image loaded.");   
         }   
       }   
       private void showAbout()   
       {   
         JOptionPane.showMessageDialog(frame,"ImageViewer\n" + VERSION,"About ImageViewer", JOptionPane.INFORMATION_MESSAGE);   
       }  
       private void showFilename(String filename)   
       {   
         if(filename == null) {   
           filenameLabel.setText("No file displayed.");   
         }   
         else {   
           filenameLabel.setText("File: " + filename);   
         }   
       }   
       private void showStatus(String text)   
       {   
         statusLabel.setText(text);   
       }   
       private void makeFrame()   
       {   
         frame = new JFrame("ImageViewer");   
         makeMenuBar(frame);   
         Container contentPane = frame.getContentPane();   
         contentPane.setLayout(new BorderLayout(6, 6));   
         filenameLabel = new JLabel();   
         contentPane.add(filenameLabel, BorderLayout.NORTH);   
         imagePanel = new ImagePanel();   
         contentPane.add(imagePanel, BorderLayout.CENTER);   
         statusLabel = new JLabel(VERSION);   
         contentPane.add(statusLabel, BorderLayout.SOUTH);     
         showFilename(null);   
         frame.pack();   
         Dimension d = Toolkit.getDefaultToolkit().getScreenSize();   
         frame.setLocation(d.width/2 - frame.getWidth()/2, d.height/2 - frame.getHeight()/2);   
         frame.setVisible(true);   
       }   
       private void makeMenuBar(JFrame frame)   
       {   
         final int SHORTCUT_MASK =Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); JMenuBar menubar = new JMenuBar(); frame.setJMenuBar(menubar);   
         JMenu menu;   
         JMenuItem item;   
         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("Quit");   
         item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, SHORTCUT_MASK));   
         item.addActionListener(new ActionListener() {   
            public void actionPerformed(ActionEvent e) {  
              quit();  
            }   
         });   
         menu.add(item);    
         menu = new JMenu("Filter");   
         menubar.add(menu);   
         item = new JMenuItem("Darker");   
         item.addActionListener(new ActionListener() {   
           public void actionPerformed(ActionEvent e) {  
              makeDarker();  
           }   
         });   
         menu.add(item);   
         item = new JMenuItem("Lighter");   
         item.addActionListener(new ActionListener() {   
            public void actionPerformed(ActionEvent e) {  
              makeLighter();  
            }   
         });   
         menu.add(item);   
         item = new JMenuItem("Threshold");   
         item.addActionListener(new ActionListener() {   
            public void actionPerformed(ActionEvent e) {  
              threshold();  
            }   
         });   
         menu.add(item);    
         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);   
       }   
      }  
    

Demo Aplikasi

  1. Tampilan GUI



  2. Pengguna membuka file citra pada komputer menggunakan menu File -> Open




  3. Pengguna meng-apply filter threshold pada citra


Comments

Popular posts from this blog

ETS PBO

Tugas 6 PBO - Game World of Zuul

Tugas 2 PBO - Aplikasi Traffic Light