TUGAS PBO-C Pertemuan-7 : Image Viewer

 TUGAS PBO-C Pertemuan-7 : Image Viewer

  

           Pada pertemuan ketujuh kelas PBO-C, saya diberi tugas untuk membuat Image Viewer dengan menggunakan Blue-J. Image Viewer itu tersendiri yaitu merupakan program yang dibuat untuk melihat gambar yang telah kita pilih nantinya.



Pada Image Viewer ini terdapat 4 Class yang terdiri dari :

1. ImageViewer Class

          Pada ImageViewer Class ini merupakan class yang utama  yang berfungsi untuk memanggil semua komponen fungsi lainnya.

Source code 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);
 
}
}


2. OFImage Class

          Pada OFImage Class ini merupakan class yang utama  yang berfungsi untuk memanggil semua komponen fungsi lainnya.

Source Code OFImage Class :

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


3.  ImagePanel Class

          Pada OFImage Class ini merupakan class yang berfungsi untuk mengatur tinggi dan lebar aplikasi agar menyesuaikan foto

Source Code ImagePanel Class : 

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


4.  ImageFileManager

          Pada ImageFileManager Class ini merupakan class yang berfungsi untuk memuat gambar dari foto. 

Source Code ImageFileManager Class : 

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;
}
}
}


Contoh Program yang telah dijalankan :






    Sekian tugas pertemuan ke-7 dari saya, mohon maaf jika ada kesalahan kata, sekian terima kasih.








































































Komentar

Postingan populer dari blog ini

TUGAS PWEB-D Pertemuan - 4 : Bootstrap

TUGAS PWEB-D Pertemuan - 5 : Form Validasi

Tugas PWEB-D Pertemuan Ke-1 : Biodata