Tugas 7 Image Viewer Kelas PBO C

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




Source Code Class ImageViewer

/**
* Class utama aplikasi yang berfungsi untuk build dan menampilkan GUI serta
* inisalisasi semua komponen class lainnya.
* * @author Aimar Wibowo
import java.awt.image.*;
* @version 8 Desember 2020
*/ import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
private static final String VERSION = "Version 1.0";
import java.io.File;
public class ImageViewer
{ // Field static
private JFrame frame;
private static JFileChooser fileChooser = new JFileChooser(System.getProperty("user.dir"));
// Field private ImagePanel imagePanel;
makeFrame();
private JLabel filenameLabel;
private JLabel statusLabel;
private OFImage currentImage; public ImageViewer() {
if (returnVal != JFileChooser.APPROVE_OPTION)
currentImage = null; }
// ---- Implementasi fungsi menu ----
private void openFile() {
int returnVal = fileChooser.showOpenDialog(frame);
{ return; // Di-cancel }
JOptionPane.showMessageDialog(frame, "The file was not in a recognized image file format.",
File selectedFile = fileChooser.getSelectedFile();
currentImage = ImageFileManager.loadImage(selectedFile);
if (currentImage == null) // Gambar tidak valid
"Image Load Error", JOptionPane.ERROR_MESSAGE);
{
imagePanel.clearImage();
return;
}
imagePanel.setImage(currentImage);
showFilename(selectedFile.getPath());
}
showStatus("File loaded."); frame.pack();
showStatus("Applied: darker");
private void close() { currentImage = null;
showFilename(null);
}
{
private void quit()
private void makeDarker()
System.exit(0); } {
currentImage.darker();
if (currentImage != null) { frame.repaint();
showStatus("No image loaded.");
} else {
showStatus("No image loaded.");
} }
if (currentImage != null)
private void makeLighter() { {
frame.repaint();
currentImage.lighter(); showStatus("Applied: lighter");
{
} else { } }
private void threshold()
{
if (currentImage != null)
{
frame.repaint();
currentImage.threshold();
}
showStatus("Applied: threshold"); else {
private void showAbout()
showStatus("No image loaded."); } }
JOptionPane.showMessageDialog(frame, "ImageViewer\n" + VERSION,
"About ImageViewer", JOptionPane.INFORMATION_MESSAGE); }
private void showFilename(String filename)
// ---- Method support ---- {
filenameLabel.setText("No file displayed.");
if (filename == null) { } else {
Container contentPane = frame.getContentPane();
filenameLabel.setText("File: " + filename);
} }
statusLabel.setText(text);
private void showStatus(String text) { }
// ---- Hal-hal yang dibutuhkan untuk build frame beserta semua komponennya ----
private void makeFrame() { frame = new JFrame("ImageViewer"); makeMenuBar(frame);
// Mengatur dan menampilkan konten
// Pengaturan layout contentPane.setLayout(new BorderLayout(6, 6));
contentPane.add(filenameLabel, BorderLayout.NORTH);
filenameLabel = new JLabel();
contentPane.add(imagePanel, BorderLayout.CENTER);
imagePanel = new ImagePanel(); statusLabel = new JLabel(VERSION);
showFilename(null);
contentPane.add(statusLabel, BorderLayout.SOUTH); frame.pack();
JMenuItem item;
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) {
JMenuBar menubar = new JMenuBar();
final int SHORTCUT_MASK = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); frame.setJMenuBar(menubar); JMenu menu;
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, SHORTCUT_MASK));
// Membuat menu File menu = new JMenu("File");
menubar.add(menu);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, SHORTCUT_MASK));
item = new JMenuItem("Open");
{
item.addActionListener(new ActionListener()
openFile();
public void actionPerformed(ActionEvent e) { } });
{
menu.add(item); item = new JMenuItem("Close");
item.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{ close(); }
}); menu.add(item); menu.addSeparator();
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, SHORTCUT_MASK));
item = new JMenuItem("Quit"); item.addActionListener(new ActionListener()
item.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent e)
quit();
}
menu.add(item);
});
menu = new JMenu("Filter");
// Membuat menu Filter
item = new JMenuItem("Darker");
menubar.add(menu);
{
item.addActionListener(new ActionListener()
makeDarker();
public void actionPerformed(ActionEvent e) { } });
menubar.add(menu);
menu.add(item); item = new JMenuItem("Lighter"); {
public void actionPerformed(ActionEvent e)
{ makeLighter();
} }); menu.add(item);
item.addActionListener(new ActionListener()
item = new JMenuItem("Threshold"); {
threshold();
public void actionPerformed(ActionEvent e) { } });
item = new JMenuItem("About ImageViewer");
menu.add(item); // Membuat menu Help menu = new JMenu("Help");
}
item.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{ showAbout(); }
}
});
menu.add(item);


Source Code Class ImageFileManager

/**
* Class utilitas yang memakai method static untuk memuat dan menyimpan gambar.
*
* File yang diunggah dapat berupa format JPG atau PNG.
*
import java.awt.image.*;
* @author Aimar Wibowo
* @version 8 Desember 2020
*/
// Nilai konstan untuk format gambar yang digunakan writer
import javax.imageio.*;
import java.io.*;
public class ImageFileManager
{
public static OFImage loadImage(File imageFile)
private static final String IMAGE_FORMAT = "jpg";
{ try {
if (image == null || (image.getWidth(null) < 0))
BufferedImage image = ImageIO.read(imageFile);
{
return new OFImage(image);
// Gambar tidak termuat, kemungkinan format file salah
return null; } }
try
catch (IOException exc)
return null;
{ } }
public static void saveImage(OFImage image, File file)
{ {

ImageIO.write(image, IMAGE_FORMAT, file);
} catch(IOException exc)
}
{ return; }
}


Source Code Class ImagePanel

/**
* Class ini berisi komponen Swing yang dapat menampilkan OFImage.
* Dibuat sebagai subclass JComponent untuk fungsionalitas pengaturan OFImage.
*
* @author Aimar Wibowo
* @version 8 Desember 2020
*/ import java.awt.*;
public class ImagePanel extends JComponent
import javax.swing.*;
import java.awt.image.*;
{
// Lebar dan tinggi panel saat ini
// Internal image buffer untuk painting, ditampilkan di screen.
private int width, height;
private OFImage panelImage;
public ImagePanel() {
public void setImage(OFImage image)
width = 360; // Ukuran panel kosongan bebas
height = 240; panelImage = null;
}
} { if (image != null)
{
width = image.getWidth();
height = image.getHeight();
panelImage = image;
imageGraphics.fillRect(0, 0, width, height);
repaint(); }
public void clearImage()
{
Graphics imageGraphics = panelImage.getGraphics();
imageGraphics.setColor(Color.LIGHT_GRAY);
{
repaint();
}
// Method di bawah untuk mendefinisikan ulang method warisan dari superclass.
public Dimension getPreferredSize()
g.clearRect(0, 0, size.width, size.height);
return new Dimension(width, height);
}
{
public void paintComponent(Graphics g)
if (panelImage != null)
Dimension size = getSize(); {
}
g.drawImage(panelImage, 0, 0, null);
}
}


Source Code Class OFImage

/**
* Class untuk mendefinisikan gambar sebagai OF (Object Firsts).
*
* @author Aimar Wibowo
* @version 8 Desember 2020
*/
import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
public OFImage(BufferedImage image)
public class OFImage extends BufferedImage
{ {
image.isAlphaPremultiplied(), null);
super(image.getColorModel(), image.copyData(null),
}
public void setPixel(int x, int y, Color col)
public OFImage(int width, int height)
{
super(width, height, TYPE_INT_RGB);
} {
public Color getPixel(int x, int y)
int pixel = col.getRGB();
setRGB(x, y, pixel);
int pixel = getRGB(x, y);
} {
return new Color(pixel);
}
int height = getHeight();
public void darker() {
setPixel(x, y, getPixel(x, y).darker());
int width = getWidth(); for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++)
{ { } }
{
} public void lighter() {
int height = getHeight();
int width = getWidth();
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
for (int y = 0; y < height; y++)
setPixel(x, y, getPixel(x, y).brighter());
} } }
int height = getHeight();
public void threshold() {
if (brightness <= 85)
int width = getWidth(); {
for (int x = 0; x < width; x++)
{
Color pixel = getPixel(x, y);
int brightness = (pixel.getRed() + pixel.getBlue() + pixel.getGreen()) / 3;
{
{
setPixel(x, y, Color.BLACK);
}
{
else if (brightness <= 170)
setPixel(x, y, Color.GRAY); } else
}
setPixel(x, y, Color.WHITE);
} } }
}


Output

Tampilan awal gambar


Filter lighter 



Filter darker


Filter threshold




Komentar

Postingan populer dari blog ini

Tugas 6 World of Zuul Kelas PBO C

Final Project / EAS Kelas PBO C

ETS RK B