Skip to main content

Image Viewer GUI

Implementasi Object-Oriented Programming dari Image Viewer yang berfungsi untuk melakukan load sebuah gambar dan memungkinkan dilakukannya manipulasi gambar. Library Java yang digunakan dalam project ini antara lain :

  1. Awt (Event, Image)
  2. Swing
  3. File IO
Class yang diimplementasikan antara lain :
  1. ImageViewer (Sebagai main class yang melakukan display image pada aplikasi GUI)
  2. ImagePanel (Sebagai class yang menampilkan OFImage serta menambah functionality)
  3. ImageFileManager (Sebagai class utility untuk melakukan load image)
  4. OFImage (Sebagai class yang mendefinisikan image sebagai object)

Source Code

ImageViewer
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;

import java.io.File;

/**
 *
 * @author Satria Ade Veda Karuniawan
 * @version 1.0
 */
public class ImageViewer
{
    // static fields:
    private static final String VERSION = "Version 1.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 OFImage currentImage;
   
    /**
     * Create an ImageViewer show it on screen.
     */
    public ImageViewer()
    {
        currentImage = null;
        makeFrame();
    }


    // ---- implementation of menu functions ----
   
    /**
     * Open function: open a file chooser to select a new image file.
     */
    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);
        showFilename(selectedFile.getPath());
        showStatus("File loaded.");
        frame.pack();
    }
   
    /**
     * Close function: close the current image.
     */
    private void close()
    {
        currentImage = null;
        imagePanel.clearImage();
        showFilename(null);
    }
   
    /**
     * Quit function: quit the application.
     */
    private void quit()
    {
        System.exit(0);
    }
   
   
    /**
     * 'Darker' function: make the picture darker.
     */
    private void makeDarker()
    {
        if(currentImage != null) {
            currentImage.darker();
            frame.repaint();
            showStatus("Applied: darker");
        }
        else {
            showStatus("No image loaded.");
        }
    }
   
    /**
     * 'Lighter' function: make the picture lighter
     */
    private void makeLighter()
    {
        if(currentImage != null) {
            currentImage.lighter();
            frame.repaint();
            showStatus("Applied: lighter");
        }
        else {
            showStatus("No image loaded.");
        }
    }
   
    /**
     * 'threshold' function: apply the threshold filter
     */
    private void threshold()
    {
        if(currentImage != null) {
            currentImage.threshold();
            frame.repaint();
            showStatus("Applied: threshold");
        }
        else {
            showStatus("No image loaded.");
        }
    }
   
    /**
     * 'Lighter' function: make the picture lighter
     */
    private void showAbout()
    {
        JOptionPane.showMessageDialog(frame,
                    "ImageViewer\n" + VERSION,
                    "About ImageViewer",
                    JOptionPane.INFORMATION_MESSAGE);
    }
   
   
    // ---- support methods ----

    /**
     * Display a file name on the appropriate label.
     * @param filename The file name to be displayed.
     */
    private void showFilename(String filename)
    {
        if(filename == null) {
            filenameLabel.setText("No file displayed.");
        }
        else {
            filenameLabel.setText("File: " + filename);
        }
    }
   
    /**
     * Display a status message in the frame's status bar.
     * @param text The status message to be displayed.
     */
    private void showStatus(String text)
    {
        statusLabel.setText(text);
    }
   
    // ---- swing stuff to build the frame and all its components ----
   
    /**
     * Create the Swing frame and its content.
     */
    private void makeFrame()
    {
        frame = new JFrame("ImageViewer");
        makeMenuBar(frame);
       
        Container contentPane = frame.getContentPane();
       
        // Specify the layout manager with nice spacing
        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);
       
        // building is done - arrange the components and show       
        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);
    }
   
    /**
     * 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("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);
       
        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);

        // 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);

    }
}

ImagePanel
import java.awt.*;
import javax.swing.*;
import java.awt.image.*;

/**
 *
 * @author Satria Ade Veda Karuniawan
 * @version 1.0
 */
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);
        }
    }
}

ImageFileManager
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;

/**
 *
 * @author Satria Ade Veda Karuniawan
 * @version 1.0
 */
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;
        }
    }
}

OFImage
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;

/**
 *
 * @author Satria Ade Veda Karuniawan
 * @version 1.0
 */
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);
    }

    /**
     * Make this image a bit darker.
     */
    public void darker()
    {
        int height = getHeight();
        int width = getWidth();
        for(int y = 0; y < height; y++) {
            for(int x = 0; x < width; x++) {
                setPixel(x, y, getPixel(x, y).darker());
            }
        }
    }

    /**
     * Make this image a bit lighter.
     */
    public void lighter()
    {
        int height = getHeight();
        int width = getWidth();
        for(int y = 0; y < height; y++) {
            for(int x = 0; x < width; x++) {
                setPixel(x, y, getPixel(x, y).brighter());
            }
        }
    }

    /**
     * Perform a three level threshold operation.
     * That is: repaint the image with only three color values:
     *          white, gray, and black.
     */
    public void threshold()
    {
        int height = getHeight();
        int width = getWidth();
        for(int y = 0; y < height; y++) {
            for(int x = 0; x < width; x++) {
                Color pixel = getPixel(x, y);
                int brightness = (pixel.getRed() + pixel.getBlue() + pixel.getGreen()) / 3;
                if(brightness <= 85) {
                    setPixel(x, y, Color.BLACK);
                }
                else if(brightness <= 170) {
                    setPixel(x, y, Color.GRAY);
                }
                else {
                    setPixel(x, y, Color.WHITE);
                }
            }
        }
    }
}

Screenshot Workspace

Simulasi :

  • Load Image
dilakukan dengan cara membuat instance object, File/Open/(directory images)

Original Image Load

  • Filter Darker

  • Filter Lighter

  • Filter Threshold

Comments

Popular posts from this blog

Technical Support AI

Technical Support - Artificial Intelligence (*From now on, I'll try my best to explain about all of my Project using English) For this project, I made 3 classes to control the Bot Mechanism (Referencing to Objects-First-with-Java-A-Practical-Introduction-Using-BlueJ-David-J-Barnes pages 155) : InputReader Class (Used for detect or to take any user input) SupportSystem Class (As a main function connecting the user input and database) Responder Class (Handling AI-Output and Its role as 'mini' database) Current Version : 1.2 In the future, I'm expecting to have a bigger Responder's Database and would be separated from the Class itself, so it will be easier to make some modification inside the AI's Database and easier to manage. And then i'll try to improve the UX Design inside, so that the user can have a feeling about how 'Human' this AI. InputReader Class In this class, pretty much the same as how the name of the class is writt

University Database System

Implementasi sebuah sistem database dengan menggunakan OOP dan disertai oleh File Handling, terdapat 8 rancangan class : Database (Class yang memiliki kemiripan dengan CRUD system) MainMenu (Menu utama tempat user berinteraksi) PeminjamanBuku (Class Peminjaman yang dapat dimodifikasi) MataKuliah (Class MataKuliah yang dapat dimodifikasi) Orang (Class yang menjadi parent dari Pegawai, Dosen, Mahasiswa) Pegawai Dosen Mahasiswa Source Code (*yang dicantumkan adalah source code inti, source code yang sifatnya dinamis. Selain Database, MainMenu, Orang, PeminjamanBuku, dan MataKuliah) Database import java.io.File; import java.io.IOException; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.FileReader; import java.io.BufferedReader; import java.util.Scanner; /**  *  *  * @author Satria Ade Veda Karuniawan  * @version 0.1  */ public class Database {     public Database()     {     }         public void Add(String text, Str