PBO - UAS
Nama : Muh.Shafwatallah Wahid
NRP : 05111740007002
1).
Rancangan yang akan dibuat
2).
NRP : 05111740007002
Soal
1. Gambarkan rancangan interfacenya.
2. Gambarkan dan jelaskan Class Diagram penyusun dari image viewer yang akan dibuat.
3. Implementasikan ke dalam program dan buat link nya di posting blog ini.
Jawaban
1).
Rancangan yang akan dibuat
2).
Kelas yang dipakai pada program ini
3)
OFImage
import java.awt.*; import java.awt.image.*; import javax.swing.*; /** * Write a description of class OFImage here. * * @author */ 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); } }
ImageFileManager
import java.awt.image.*; import javax.imageio.*; import java.io.*; /** * Write a description of class ImageFileManager here. * * @author */ 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; } } }
ImageViewer
/** * Write a description of class ImageViewer here. * * @author */ import java.awt.*; import java.awt.event.*; import java.awt.image.*; import javax.swing.*; import javax.swing.border.*; import java.io.File; import java.util.List; import java.util.ArrayList; import java.util.Iterator; public class ImageViewer { // static fields: private static final String VERSION = "Version 3.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 JButton smallerButton; private JButton largerButton; private OFImage currentImage; private List<Filter> filters; /** * Create an ImageViewer and display its GUI on screen. */ public ImageViewer() { currentImage = null; filters = createFilters(); makeFrame(); } // ---- implementation of menu functions ---- /** * Open function: open a file chooser to select a new image file, * and then display the chosen image. */ private void openFile() { int returnVal = fileChooser.showOpenDialog(frame); if(returnVal != JFileChooser.APPROVE_OPTION) { return; // cancelled } File selectedFile = fileChooser.getSelectedFile(); currentImage = ImageFileManager.loadImage(selectedFile); if(currentImage == null) { // image file was not a valid image JOptionPane.showMessageDialog(frame, "The file was not in a recognized image file format.", "Image Load Error", JOptionPane.ERROR_MESSAGE); return; } imagePanel.setImage(currentImage); setButtonsEnabled(true); showFilename(selectedFile.getPath()); showStatus("File loaded."); frame.pack(); } /** * Close function: close the current image. */ private void close() { currentImage = null; imagePanel.clearImage(); showFilename(null); setButtonsEnabled(false); } /** * Save As function: save the current image to a file. */ private void saveAs() { if(currentImage != null) { int returnVal = fileChooser.showSaveDialog(frame); if(returnVal != JFileChooser.APPROVE_OPTION) { return; // cancelled } File selectedFile = fileChooser.getSelectedFile(); ImageFileManager.saveImage(currentImage, selectedFile); showFilename(selectedFile.getPath()); } } /** * Quit function: quit the application. */ private void quit() { System.exit(0); } /** * Apply a given filter to the current image. * * @param filter The filter object to be applied. */ private void applyFilter(Filter filter) { if(currentImage != null) { filter.apply(currentImage); frame.repaint(); showStatus("Applied: " + filter.getName()); } else { showStatus("No image loaded."); } } /** * 'About' function: show the 'about' box. */ private void showAbout() { JOptionPane.showMessageDialog(frame, "ImageViewer\n" + VERSION, "About ImageViewer", JOptionPane.INFORMATION_MESSAGE); } /** * Make the current picture larger. */ private void makeLarger() { if(currentImage != null) { // create new image with double size int width = currentImage.getWidth(); int height = currentImage.getHeight(); OFImage newImage = new OFImage(width * 2, height * 2); // copy pixel data into new image for(int y = 0; y < height; y++) { for(int x = 0; x < width; x++) { Color col = currentImage.getPixel(x, y); newImage.setPixel(x * 2, y * 2, col); newImage.setPixel(x * 2 + 1, y * 2, col); newImage.setPixel(x * 2, y * 2 + 1, col); newImage.setPixel(x * 2+1, y * 2 + 1, col); } } currentImage = newImage; imagePanel.setImage(currentImage); frame.pack(); } } /** * Make the current picture smaller. */ private void makeSmaller() { if(currentImage != null) { // create new image with double size int width = currentImage.getWidth() / 2; int height = currentImage.getHeight() / 2; OFImage newImage = new OFImage(width, height); // copy pixel data into new image for(int y = 0; y < height; y++) { for(int x = 0; x < width; x++) { newImage.setPixel(x, y, currentImage.getPixel(x * 2, y * 2)); } } currentImage = newImage; imagePanel.setImage(currentImage); frame.pack(); } } private void makeCrop() { if (currentImage != null) { int width = currentImage.getWidth(); int height = currentImage.getWidth(); int xAwal = Integer.parseInt(JOptionPane.showInputDialog("xAwal")); int yAwal = Integer.parseInt(JOptionPane.showInputDialog("yAwal")); int xAkhir = Integer.parseInt(JOptionPane.showInputDialog("xAkhir")); int yAkhir = Integer.parseInt(JOptionPane.showInputDialog("yAkhir")); OFImage newImage = new OFImage(xAkhir - xAwal, yAkhir - yAwal); for (int y = 0; y < yAkhir - yAwal; y++) { for (int x = 0; x < xAkhir - xAwal; x++) { newImage.setPixel(x, y, currentImage.getPixel(x + xAwal, y + yAwal)); } } currentImage = newImage; imagePanel.setImage(currentImage); frame.pack(); } } private void makeText() { JTextField xField = new JTextField(5); JTextField yField = new JTextField(5); JTextField zField = new JTextField(5); JPanel myPanel = new JPanel(); myPanel.add(new JLabel("R")); myPanel.add(xField); myPanel.add(Box.createVerticalStrut(15)); // a spacer myPanel.add(new JLabel("G")); myPanel.add(yField); myPanel.add(Box.createVerticalStrut(15)); // a spacer myPanel.add(new JLabel("B")); myPanel.add(zField); if(currentImage != null) { int width = currentImage.getWidth(); int height = currentImage.getHeight(); int xPosition = Integer.parseInt(JOptionPane.showInputDialog("Posisi X")); int yPosition = Integer.parseInt(JOptionPane.showInputDialog("Posisi Y")); float fontSize = Float.parseFloat(JOptionPane.showInputDialog("Ukuran font")); String addText = JOptionPane.showInputDialog("Tuliskan sesuatu..."); int result = JOptionPane.showConfirmDialog(null, myPanel, "Warna font", JOptionPane.OK_CANCEL_OPTION); OFImage newImage = new OFImage(width, height); // copy pixel data into new image for(int y = 0; y < height; y++) { for(int x = 0; x < width; x++) { Color col = currentImage.getPixel(x, y); newImage.setPixel(x, y, col); } } int r = Integer.parseInt(xField.getText()); int gr = Integer.parseInt(yField.getText()); int b = Integer.parseInt(zField.getText()); Color c = new Color(r,gr,b); Graphics g = newImage.getGraphics(); g.setFont(g.getFont().deriveFont(fontSize)); g.setColor(c); g.drawString(addText, xPosition, yPosition); g.dispose(); currentImage = newImage; imagePanel.setImage(currentImage); } } private void Rotate180() { if(currentImage != null) { // create new image with double size int width = currentImage.getWidth(); int height = currentImage.getHeight(); OFImage newImage = new OFImage(width, height); //copy pixel data into new image for(int y = 0; y < height; y++) { for(int x = 0; x < width; x++) { Color col = currentImage.getPixel(width-x-1, height-y-1); newImage.setPixel(x, y, col); } } currentImage = newImage; imagePanel.setImage(currentImage); frame.pack(); } } private void Rotate90left() { if(currentImage != null) { // create new image with double size int width = currentImage.getWidth(); int height = currentImage.getHeight(); OFImage newImage = new OFImage(height, width); //copy pixel data into new image for(int y = 0; y < height; y++) { for(int x = 0; x < width; x++) { Color col = currentImage.getPixel(x, y); newImage.setPixel(y, width-x-1, col); } } currentImage = newImage; imagePanel.setImage(currentImage); frame.pack(); } } private void Rotate90right() { if(currentImage != null) { // create new image with double size int width = currentImage.getWidth(); int height = currentImage.getHeight(); OFImage newImage = new OFImage(height, width); //copy pixel data into new image for(int y = 0; y < height; y++) { for(int x = 0; x < width; x++) { Color col = currentImage.getPixel(x, y); newImage.setPixel(height-y-1, x, col); } } currentImage = newImage; imagePanel.setImage(currentImage); frame.pack(); } } // ---- support methods ---- /** * Show the file name of the current image in the fils display label. * 'null' may be used as a parameter if no file is currently loaded. * * @param filename The file name to be displayed, or null for 'no file'. */ private void showFilename(String filename) { if(filename == null) { filenameLabel.setText("No file displayed."); } else { filenameLabel.setText("File: " + filename); } } /** * Show a message in the status bar at the bottom of the screen. * @param text The message to be displayed. */ private void showStatus(String text) { statusLabel.setText(text); } /** * Enable or disable all toolbar buttons. * * @param status 'true' to enable the buttons, 'false' to disable. */ private void setButtonsEnabled(boolean status) { smallerButton.setEnabled(status); largerButton.setEnabled(status); } /** * Create a list with all the known filters. * @return The list of filters. */ private List<Filter> createFilters() { List<Filter> filterList = new ArrayList<Filter>(); filterList.add(new DarkerFilter("Darker")); filterList.add(new LighterFilter("Lighter")); filterList.add(new ThresholdFilter("Threshold")); filterList.add(new FishEyeFilter("Fish Eye")); filterList.add(new MirrorFilter("Mirror")); return filterList; } // ---- swing stuff to build the frame and all its components ---- /** * Create the Swing frame and its content. */ private void makeFrame() { frame = new JFrame("ImageViewer"); JPanel contentPane = (JPanel)frame.getContentPane(); contentPane.setBorder(new EmptyBorder(6, 6, 6, 6)); makeMenuBar(frame); // Specify the layout manager with nice spacing contentPane.setLayout(new BorderLayout(6, 6)); // Create the image pane in the center imagePanel = new ImagePanel(); imagePanel.setBorder(new EtchedBorder()); contentPane.add(imagePanel, BorderLayout.CENTER); // Create two labels at top and bottom for the file name and status message filenameLabel = new JLabel(); contentPane.add(filenameLabel, BorderLayout.NORTH); statusLabel = new JLabel(VERSION); contentPane.add(statusLabel, BorderLayout.SOUTH); // Create the toolbar with the buttons JPanel toolbar = new JPanel(); toolbar.setLayout(new GridLayout(0, 1)); smallerButton = new JButton("Smaller"); smallerButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { makeSmaller();} }); toolbar.add(smallerButton); largerButton = new JButton("Larger"); largerButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { makeLarger();} }); toolbar.add(largerButton); // Add toolbar into panel with flow layout for spacing JPanel flow = new JPanel(); flow.add(toolbar); contentPane.add(flow, BorderLayout.WEST); // building is done - arrange the components showFilename(null); setButtonsEnabled(false); frame.pack(); // place the frame at the center of the screen and show Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); frame.setLocation(d.width/2 - frame.getWidth()/2, d.height/2 - frame.getHeight()/2); frame.setVisible(true); } /** * Create the main frame's menu bar. * * @param frame The frame that the menu bar should be added to. */ 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("Save As..."); item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, SHORTCUT_MASK)); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { saveAs(); } }); 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); for(final Filter filter : filters) { item = new JMenuItem(filter.getName()); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { applyFilter(filter); } }); menu.add(item); } menu = new JMenu("Crop"); menubar.add(menu); item = new JMenuItem("Crop Image"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { makeCrop(); } }); menu.add(item); menu = new JMenu("Text"); menubar.add(menu); item = new JMenuItem("Add Text"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { makeText(); } }); menu.add(item); menu = new JMenu("Rotate"); menubar.add(menu); item = new JMenuItem("Rotate 180"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Rotate180(); } }); menu.add(item); item = new JMenuItem("Rotate 90 Left"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Rotate90left(); } }); menu.add(item); item = new JMenuItem("Rotate 90 Right"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Rotate90right(); } }); 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); } }
MirrorFilter
/** * Write a description of class MirrorFilter here. * * @author */ import java.awt.Color; public class MirrorFilter extends Filter { /** * Constructor for objects of class MirrorFilter. * @param name The name of the filter. */ public MirrorFilter(String name) { super(name); } /** * Apply this filter to an image. * * @param image The image to be changed by this filter. */ public void apply(OFImage image) { int height = image.getHeight(); int width = image.getWidth(); for(int y = 0; y < height; y++) { for(int x = 0; x < width / 2; x++) { Color left = image.getPixel(x, y); image.setPixel(x, y, image.getPixel(width - 1 - x, y)); image.setPixel(width - 1 - x, y, left); } } } }
FishEyeFilter
/** * Write a description of class FishEyeFilter here. * * @author */ import java.awt.Color; public class FishEyeFilter extends Filter { // constants: private final static int SCALE = 20; // this defines the strenght of the filter private final static double TWO_PI = 2 * Math.PI; /** * Constructor for objects of class LensFilter. * @param name The name of the filter. */ public FishEyeFilter(String name) { super(name); } /** * Apply this filter to an image. * * @param image The image to be changed by this filter. */ public void apply(OFImage image) { int height = image.getHeight(); int width = image.getWidth(); OFImage original = new OFImage(image); int[] xa = computeXArray(width); int[] ya = computeYArray(height); for(int y = 0; y < height; y++) { for(int x = 0; x < width; x++) { image.setPixel(x, y, original.getPixel(x + xa[x], y + ya[y])); } } } /** * Compute and return an array of horizontal offsets for each pixel column. * These can then be applied as the horizontal offset for each pixel. */ private int[] computeXArray(int width) { int[] xArray = new int[width]; for(int i=0; i < width; i++) { xArray[i] = (int)(Math.sin( ((double)i / width) * TWO_PI) * SCALE); } return xArray; } /** * Compute and return an array of vertical offsets for each pixel row. * These can then be applied as the vertical offset for each pixel. */ private int[] computeYArray(int height) { int[] yArray = new int[height]; for(int i=0; i < height; i++) { yArray[i] = (int)(Math.sin( ((double)i / height) * TWO_PI) * SCALE); } return yArray; } }
ThresholdFilter
import java.awt.Color; /** * Write a description of class ThresholdFilter here. * * @author (Shafwatallah) */ public class ThresholdFilter extends Filter { public ThresholdFilter(String name) { super(name); } public void apply(OFImage image) { int height = image.getHeight(); int width = image.getWidth(); for(int y = 0; y < height; y++) { for(int x = 0; x < width; x++) { Color pixel = image.getPixel(x, y); int brightness = (pixel.getRed() + pixel.getBlue() + pixel.getGreen()) / 3; if(brightness <= 85) { image.setPixel(x, y, Color.BLACK); } else if(brightness <= 170) { image.setPixel(x, y, Color.GRAY); } else { image.setPixel(x, y, Color.WHITE); } } } } }
LighterFilter
/** * Write a description of class LighterFilter here. * * @author */ public class LighterFilter extends Filter { public LighterFilter(String name) { super(name); } public void apply(OFImage image) { int height = image.getHeight(); int width = image.getWidth(); for(int y = 0; y < height; y++) { for(int x = 0; x < width; x++) { image.setPixel(x, y, image.getPixel(x, y).brighter()); } } } }
DarkerFilter
/** * Write a description of class DarkerFilter here. * * @author */ public class DarkerFilter extends Filter { public DarkerFilter(String name) { super(name); } public void apply(OFImage image) { int height = image.getHeight(); int width = image.getWidth(); for(int y = 0; y < height; y++) { for(int x = 0; x < width; x++) { image.setPixel(x, y, image.getPixel(x, y).darker()); } } } }
ImagePanel
import java.awt.*; import javax.swing.*; import java.awt.image.*; /** * Write a description of class ImagePanel here. * * @author */ public class ImagePanel extends JComponent { private int width, height; private OFImage panelImage; public ImagePanel() { width = 360; height = 240; 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); } } }
Filter
/** * Write a description of class Filter here. * * @author (Shafwatallah) */ public abstract class Filter { private String name; public Filter(String name) { this.name = name; } public String getName() { return name; } public abstract void apply(OFImage image); }
Komentar
Posting Komentar