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 :- Class ImageViewer, merupakan class utama untuk memanggil semua komponen fungsi lain dan tampilan GUI
- 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
- Class ImageFileManager, berfungsi untuk memuat dan menyimpan gambar / foto
- 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:
0 Comments for "Tugas 7 PBO-C "Image Viewer""