Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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;
- import java.util.Scanner;
- /**
- * ImageViewer is the main class of the image viewer application. It builds and
- * displays the application GUI and initialises all other components.
- *
- * To start the application, create an object of this class.
- *
- * @author Gede
- * @version (10/12/2018)
- */
- 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 JButton resizeButton;
- private JButton cropButton;
- private JButton textButton;
- 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.");
- }
- }
- private void crop()
- {
- 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("Pixel Position X"));
- int yPosition = Integer.parseInt(JOptionPane.showInputDialog("Pixel Position Y"));
- float fontSize = Float.parseFloat(JOptionPane.showInputDialog("Font Size"));
- String addText = JOptionPane.showInputDialog("Write Something..");
- int result = JOptionPane.showConfirmDialog(null, myPanel, "Font Color", 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);
- }
- }
- /**
- * '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 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);
- cropButton.setEnabled(status);
- textButton.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 FlipVerticalFilter("Flip Vertical"));
- filterList.add(new FlipHorizontalFilter("Flip Horizontal"));
- 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);
- cropButton=new JButton("Crop");
- cropButton.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) { crop(); }
- });
- toolbar.add(cropButton);
- textButton=new JButton("MakeText");
- textButton.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) { makeText(); }
- });
- toolbar.add(textButton);
- // 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);
- }
- //edit
- menu = new JMenu("Edit");
- menubar.add(menu);
- 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);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement