Image Viewer
Dalam projek kali ini saya membuat image viewer yang dimana image viewer ini merupakan aplikasi yang dapat menampilkan sebuah gambar dan gambar tersebut bisa di edit dengan beberapa fitur yang tersedia. Class yang dipakai :
1. ImageViewer.java merupakan class utama untuk memanggil semua komponen fungsi lain dan tampilan GUI
2. ImagePanel.java, class yang berisi komponen Swing yang dapat menampilkan OFImage, class ini juga mengatur lebar dan tinggi panel aplikasi agar menyesuaikan gambar/foto
3. ImageFileManager.java, class untuk memuat dan menyimpan foto
4. OFImage.java, sebagai class yang berguna untuk mendefinisikan foto menjadi OF(object first). Kemudian beberapa fungsi edit filter seperti darker, lighter, dan threshold.
Aplikasi ini menggunakan beberapa library :
1. java.awt* , untuk proses inputan dalam sebuah program yang telah dijalankan.
2. java.awt.event* , untuk proses deklarasi dari class event yang berisi komponen program yang digunakan untuk mengambil semua file dari package event pada java.awt
3. java.awt.swing* , untuk mendeklarasikan sebuah komponen grafis dengan perintah yang dijalankan oleh program
Diagram Class :
import java.awt.*; | |
import java.awt.event.*; | |
import java.awt.image.*; | |
import javax.swing.*; | |
import java.io.File; | |
public class ImageViewer | |
{ | |
private static final String VERSION = "Version 1.0"; | |
private static JFileChooser fileChooser = new JFileChooser(System.getProperty("user.dir")); | |
private JFrame frame; | |
private ImagePanel imagePanel; | |
private JLabel filenameLabel; | |
private JLabel statusLabel; | |
private OFImage currentImage; | |
public ImageViewer() | |
{ | |
currentImage = null; | |
makeFrame(); | |
} | |
private void openFile() | |
{ | |
int returnVal = fileChooser.showOpenDialog(frame); | |
if(returnVal != JFileChooser.APPROVE_OPTION) { | |
return; | |
} | |
File selectedFile = fileChooser.getSelectedFile(); | |
currentImage = ImageFileManager.loadImage(selectedFile); | |
if(currentImage == null) { | |
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(); | |
} | |
private void close() | |
{ | |
currentImage = null; | |
imagePanel.clearImage(); | |
showFilename(null); | |
} | |
private void quit() | |
{ | |
System.exit(0); | |
} | |
private void makeDarker() | |
{ | |
if(currentImage != null) { | |
currentImage.darker(); | |
frame.repaint(); | |
showStatus("Applied: darker"); | |
} | |
else { | |
showStatus("No image loaded."); | |
} | |
} | |
private void makeLighter() | |
{ | |
if(currentImage != null) { | |
currentImage.lighter(); | |
frame.repaint(); | |
showStatus("Applied: lighter"); | |
} | |
else { | |
showStatus("No image loaded."); | |
} | |
} | |
private void threshold() | |
{ | |
if(currentImage != null) { | |
currentImage.threshold(); | |
frame.repaint(); | |
showStatus("Applied: threshold"); | |
} | |
else { | |
showStatus("No image loaded."); | |
} | |
} | |
private void showAbout() | |
{ | |
JOptionPane.showMessageDialog(frame, | |
"ImageViewer\n" + VERSION, | |
"About ImageViewer", | |
JOptionPane.INFORMATION_MESSAGE); | |
} | |
private void showFilename(String filename) | |
{ | |
if(filename == null) { | |
filenameLabel.setText("No file displayed."); | |
} | |
else { | |
filenameLabel.setText("File: " + filename); | |
} | |
} | |
private void showStatus(String text) | |
{ | |
statusLabel.setText(text); | |
} | |
private void makeFrame() | |
{ | |
frame = new JFrame("ImageViewer"); | |
makeMenuBar(frame); | |
Container contentPane = frame.getContentPane(); | |
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); | |
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); | |
} | |
private void makeMenuBar(JFrame frame) | |
{ | |
final int SHORTCUT_MASK = | |
Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); | |
JMenuBar menubar = new JMenuBar(); | |
frame.setJMenuBar(menubar); | |
JMenu menu; | |
JMenuItem item; | |
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); | |
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); | |
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); | |
} | |
} |
import java.awt.*; | |
import javax.swing.*; | |
import java.awt.image.*; | |
public class ImagePanel extends JComponent | |
{ | |
private int width, height; | |
private OFImage panelImage; | |
public ImagePanel() | |
{ | |
width = 1920; | |
height = 1080; | |
panelImage = null; | |
} | |
public void setImage(OFImage image) | |
{ | |
if(image != null) { | |
width = image.getWidth(); | |
height = image.getHeight(); | |
panelImage = image; | |
repaint(); | |
} | |
} | |
public void clearImage() | |
{ | |
Graphics imageGraphics = panelImage.getGraphics(); | |
imageGraphics.setColor(Color.LIGHT_GRAY); | |
imageGraphics.fillRect(0, 0, width, height); | |
repaint(); | |
} | |
public Dimension getPreferredSize() | |
{ | |
return new Dimension(width, height); | |
} | |
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.java
import java.awt.image.*; | |
import javax.imageio.*; | |
import java.io.*; | |
public class ImageFileManager | |
{ | |
private static final String IMAGE_FORMAT = "jpg"; | |
public static OFImage loadImage(File imageFile) | |
{ | |
try | |
{ | |
BufferedImage image = ImageIO.read(imageFile); | |
if(image == null || (image.getWidth(null)<0)) | |
{ | |
return null; | |
} | |
return new OFImage(image); | |
} | |
catch (IOException exc) | |
{ | |
return null; | |
} | |
} | |
public static void saveImage(OFImage image,File file) | |
{ | |
try | |
{ | |
ImageIO.write(image, IMAGE_FORMAT,file); | |
} | |
catch(IOException exc) | |
{ | |
return; | |
} | |
} | |
} |
OFImage.java
import java.awt.*; | |
import java.awt.image.*; | |
import javax.swing.*; | |
public class OFImage extends BufferedImage | |
{ | |
public OFImage(BufferedImage image) | |
{ | |
super(image.getColorModel(), image.copyData(null), | |
image.isAlphaPremultiplied(), null); | |
} | |
public OFImage(int width, int height) | |
{ | |
super(width, height, TYPE_INT_RGB); | |
} | |
public void setPixel(int x, int y, Color col) | |
{ | |
int pixel = col.getRGB(); | |
setRGB(x, y, pixel); | |
} | |
public Color getPixel(int x, int y) | |
{ | |
int pixel = getRGB(x, y); | |
return new Color(pixel); | |
} | |
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()); | |
} | |
} | |
} | |
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()); | |
} | |
} | |
} | |
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); | |
} | |
} | |
} | |
} | |
} |
Output
Comments
Post a Comment