Tugas 7 PBO-C "Image Viewer"

December 07, 2020 0

    Pada tugas PBO kali ini, saya mencoba membuat sebuah program Image Viewer yang merupakan implementasi GUI dengan komponen AWT dan Swing. Program ini berfungsi untuk menampilkan gambar / foto dan memiliki beberapa filter di dalamnya.

Program ini menggunakan 4 Class yaitu :

  1. Class ImageViewer, merupakan class utama untuk memanggil semua komponen fungsi lain dan tampilan GUI
  2. Class ImagePanel, berisi komponen Swing yang dapat menampilkan OFI Image. Selain itu, class ini juga mengatur tinggi dan lebar panel aplikasi agar menyesuaikan gambar / foto
  3. Class ImageFileManager, berfungsi untuk memuat dan menyimpan gambar / foto
  4. Class OFImage, berfungsi untuk mendefinisikan gambar / foto menjadi OF. Selain itu, terdapat beberapa fungsi untuk edit filter seperti darker, lighter, dan threshold
  • Sourcecode ImageViewer:
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.*;
    import javax.swing.*;
    import java.io.File;
    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;
    /**
    * Buat ImageViewer yg ditampilkan pd layar.
    */
    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; // Gagal/ batal
    }
    File selectedFile = fileChooser.getSelectedFile();
    currentImage = ImageFileManager.loadImage(selectedFile);
    if(currentImage == null) { // File gambar tdk valid
    JOptionPane.showMessageDialog(frame,
    "File yang dipilih tidak sesuai dengan format yang telah ditentukan.",
    "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: keluar dari aplikasi.
    private void quit(){
    System.exit(0);
    }
    //'Darker' function: membuat gambar lebih gelap.
    private void makeDarker(){
    if(currentImage != null){
    currentImage.darker();
    frame.repaint();
    showStatus("Applied: darker");
    }else{
    showStatus("No image loaded.");
    }
    }
    // 'Lighter' function: membuat gambar lebih terang
    private void makeLighter(){
    if(currentImage != null){
    currentImage.lighter();
    frame.repaint();
    showStatus("Applied: lighter");
    }else{
    showStatus("No image loaded.");
    }
    }
    // 'threshold' function: menerapkan threshold filter
    private void threshold(){
    if(currentImage != null){
    currentImage.threshold();
    frame.repaint();
    showStatus("Applied: threshold");
    }else{
    showStatus("No image loaded.");
    }
    }
    // 'Lighter' function: membuat gambar lebih terang
    private void showAbout(){
    JOptionPane.showMessageDialog(frame,
    "ImageViewer\n" + VERSION,
    "About ImageViewer",
    JOptionPane.INFORMATION_MESSAGE);
    }
    // ---- support methods ----
    /**
    * Tampilkan nama file pada label.
    * @param filename Nama file yg akan ditampilkan.
    */
    private void showFilename(String filename){
    if(filename == null){
    filenameLabel.setText("No file displayed.");
    }else{
    filenameLabel.setText("File: " + filename);
    }
    }
    /**
    * Tampilkan status pada frame status bar.
    * @param text Status yang akan ditampilkan.
    */
    private void showStatus(String text){
    statusLabel.setText(text);
    }
    // ---- swing stuff to build the frame and all its components ----
    // Buat Swing frame beserta kontennya.
    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);
    }
    /**
    * Buat main frame's menu bar.
    * @param frame Frame yang akan ditambahkan di menu bar.
    */
    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);
     
    }
    }
    
  • Sourcecode OFImage:
    import java.awt.*;
    import java.awt.image.*;
    import javax.swing.*;
    public class OFImage extends BufferedImage{
    /**
    * Buat OFImage yg merupakan salinan BufferedImage.
    * @param image Gambar yg akan disalin.
    */
    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);
    }
    /**
    * Atur pixel gambar dg warna yg spesifik (r,g,b).
    * @param x Posisi x dlm pixel.
    * @param y Posisi y dlm pixel.
    * @param col Warna pixel.
    */
    public void setPixel(int x, int y, Color col){
    int pixel = col.getRGB();
    setRGB(x, y, pixel);
    }
    /**
    * Dapatkan value dari warna pada posisi pixel.
    * @param x Posisi x dlm pixel.
    * @param y Posisi y dlm pixel.
    * @return Warna pixel pada posisi yg sudah ditentukan.
    */
    public Color getPixel(int x, int y){
    int pixel = getRGB(x, y);
    return new Color(pixel);
    }
    // Buat gambar lebih gelap.
    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());
    }
    }
    }
    // Buat gambar lebih cerah
    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());
    }
    }
    }
    /**
    * Tampilkan three level threshold operation.
    * Untuk mewarnai ulang gambar dg tiga warna: putih, abu2, hitam
    */
    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);
    }
    }
    }
    }
    }
    
  • Sourcecode ImagePanel:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.image.*;
    public class ImagePanel extends JComponent {
     
    //Tinggi dan lebar panel sebelumnya
    private int width,height;
     
    // Buffer gambar internal yang digunakan untuk melukis.
    //Untuk tampilan yang sebenarnya,buffer gambar akan disalin ke layar
    private OFImage panelImage;
     
    //Buat imagepanel baru yang kosong
    public ImagePanel ()
    {
    width =360;
    height=240;
    panelImage=null;
    }
    /**
    * Pilih gambar yang akan ditampilkan panel
    * @param image gambar yang ditampilkan
    */
    public void setImage (OFImage image)
    {
    if (image != null)
    {
    width = image.getWidth();
    height= image.getHeight();
    panelImage=image;
    repaint ();
    }
    }
     
    //Menghilangkan gambar pada panel
    public void clearImage(){
    Graphics imageGraphics = panelImage.getGraphics();
    imageGraphics.setColor(Color.LIGHT_GRAY);
    imageGraphics.fillRect(0, 0, width, height);
    repaint();
    }
    // Metode berikut adalah redefinisi metode yg didapat dari superclasses.
    /**
    * Buat ke layout manager berapa besar yg kita inginkan.
    * (Metode ini dipanggil layout managers utk menempatkan komponen).
    * @return Dimensi yg disukai utk komponen ini.
    */
    public Dimension getPreferredSize(){
    return new Dimension(width, height);
    }
    /**
    * Komponen perlu ditampilkan lagi. Salin gambar internal ke layar.
    * (Metode ini dipanggil Swing screen painter setiap kali mau menampilkan komponen)
    * @param g Konteks grafik yg dpt digunakan utk menggambar pd komponen.
    */
    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);
    }
    }
    }
     
    
    
  • Sourcecode ImageFileManager:
    import java.awt.image.*;
    import javax.imageio.*;
    import java.io.*;
    public class ImageFileManager
    {
    //Sebuah konstanta untuk format gambar yang digunakan untuk menulis
    //Format yang tersedia adalah "jpg" dan "png"
    private static final String IMAGE_FORMAT ="jpg";
     
    /**
    * Membaca file gambar dari disk, dan menampilkan nya menjadi sebuah
    * gambar.
    * Metode ini bisa membaca format file JPG dan PNG.
    * Jika ada masalah (misalnya file tersebut tidak ada,tidak sesuai
    * dengan format yang dapat dikodekan, atau kesalahan baca lainnya) metode ini
    * tidak menampilkan apa-apa.
    *
    * @param imageFile File gambar yang akan loading.
    * @return Objek gambar atau null yang tidak dapat dibaca.
    */
    public static OFImage loadImage (File imageFile){
    try {
    BufferedImage image = ImageIO.read (imageFile);
    if (image==null||(image.getWidth(null)<0)){
    //kita tidak bisa memasukkan gambar- kemungkinan karna format salah
    return null;
    }return new OFImage (image);
    }
    catch (IOException exc){
    return null;
    }
    }
     
    /**
    * Tulis file gambar ke disk.Format file adalah JPG.
    * @param image Gambar akan disimpan
    * @param file File yang akan disimpan
    */
    public static void saveImage (OFImage image, File file){
    try {
    ImageIO.write(image,IMAGE_FORMAT,file);
    }
    catch (IOException exc){
    return;
    }
    }
    }
    

Screenshot akhir program ketika dijalankan:


Terima kasih telah berkunjung. Mohon maaf apabila ada kesalahan dalam penulisan. 💪😁

0 Comments for "Tugas 7 PBO-C "Image Viewer""