EAS PBO - IMAGE EDITOR
Nama : Yasinta Yusniawati
NRP : 05111740000054
Kelas : PBO - B
1) RANCANGAN INTERFACE
2) CLASS
3) IMPLEMENTASI PROGRAM
1. ImageViewer
2. ImageFileManager
3. ImagePanel
4. OFImage
5. PixelizeFilter
6. SmoothFilter
7. ThresholdFilter
8. InvertFilter
9. GrayScaleFilter
10. SolarizeFilter
11. LighterFilter
12. MirrorFilter
13. FishEyeFilter
14. DarkerFilter
15. EdgeFilter
16. Filter
4) SCREEN SHOT
1) RANCANGAN INTERFACE
2) CLASS
Penjelasan :
Class :
Class :
- Class ImageViewer : Untuk menjalankan program dan menggabungkan semua kelas
- Class ImagePanel: Menampilkan OFImage
- Class ImageFileManager : Membuka dan menyimpan gambar
- Semua Filter : Membuat filter gambar sesuai dengan namanya antara lain (DarkerFilter, EdgeFilter, FishEyeFilter, MirrorFilter, LighterFilter, SolarizeFilter, GrayScaleFilter, InvertFilter, ThresholdFilter, SmoothFilter, PixelizeFilter.)
Menu Tools :
- Add Text : Menambahkan tulisan pada gambar yang sudah di buka
- Crop : Memotong gambar
Menu Fitur :
- Rotate : Rotate right 90 drajat, rotate left 90 derajat, dan rotate 180 derajat. Untuk memutar gambar sesuai dengan keinginan
- Zoom : zoom in (memperbesar gambar) dan zoom out (memperkecil ukuran gambar)
3) IMPLEMENTASI PROGRAM
1. ImageViewer
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; /** * Yasinta Yusniawati * 05111740000054 * PBO - B */ public class ImageViewer { // static fields: private static final String VERSION = "Version EAS PBO "; 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; public ImageViewer() { currentImage = null; filters = createFilters(); makeFrame(); } 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); showFilename(selectedFile.getPath()); showStatus("File loaded."); frame.pack(); } private void close() { currentImage = null; imagePanel.clearImage(); showFilename(null); } 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()); } } private void quit() { System.exit(0); } private void applyFilter(Filter filter) { if(currentImage != null) { filter.apply(currentImage); frame.repaint(); showStatus("Applied: " + filter.getName()); } else { showStatus("No image loaded."); } } private void showAbout() { JOptionPane.showMessageDialog(frame, "ImageViewer\n" + VERSION, "About ImageViewer", JOptionPane.INFORMATION_MESSAGE); } 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(); } } 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 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 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 InvertFilter("Invert")); filterList.add(new SolarizeFilter("Solarize")); filterList.add(new SmoothFilter("Smooth")); filterList.add(new PixelizeFilter("Pixelize")); filterList.add(new MirrorFilter("Mirror")); filterList.add(new GrayScaleFilter("Grayscale")); filterList.add(new EdgeFilter("Edge Detection")); filterList.add(new FishEyeFilter("Fish Eye")); return filterList; } 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 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 messages filenameLabel = new JLabel(); contentPane.add(filenameLabel, BorderLayout.NORTH); statusLabel = new JLabel(VERSION); contentPane.add(statusLabel, BorderLayout.SOUTH); // building is done - arrange the components showFilename(null); 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); } 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); } } private void RotateR90() { 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(); } } private void RotateL90() { 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 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 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 ("Tools"); menubar.add(menu); item = new JMenuItem ("Crop image"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { crop ();} }); menu.add(item); item = new JMenuItem ("Add Text to image"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { makeText ();} }); menu.add(item); menu = new JMenu("View"); menubar.add(menu); item=new JMenuItem("Zoom Out (-)"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { makeSmaller ();} }); menu.add(item); item=new JMenuItem("Zoom In (+)"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { makeLarger ();} }); menu.add(item); item=new JMenuItem("Rotate 90 right"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { RotateR90();} }); menu.add(item); item=new JMenuItem("Rotate 90 left"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { RotateL90();} }); menu.add(item); item=new JMenuItem("Rotate 180"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Rotate180();} }); 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. ImageFileManager
import java.awt.image.*; import javax.imageio.*; import java.io.*; /** * Yasinta Yusniawati * 05111740000054 * PBO - B */ 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)) { // we could not load the image - probably invalid file format 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; } } }
3. ImagePanel
import java.awt.*; import javax.swing.*; import java.awt.image.*; /** * Yasinta Yusniawati * 05111740000054 * PBO - B */ public class ImagePanel extends JComponent { private int width, height; private OFImage panelImage; public ImagePanel() { width = 300; height = 200; 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); } } }
4. OFImage
import java.awt.*; import java.awt.image.*; import javax.swing.*; /** * @author Yasinta Yusniawati * @version EAS/20181210 */ 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); } }
5. PixelizeFilter
import java.awt.Color; /** * Yasinta Yusniawati * 05111740000054 * PBO - B */ public class PixelizeFilter extends Filter { public PixelizeFilter(String name) { super(name); } public void apply(OFImage image) { final int PIXEL_SIZE = 5; int width = image.getWidth(); int height = image.getHeight(); for(int y = 0; y < height; y += PIXEL_SIZE) { for(int x = 0; x < width; x += PIXEL_SIZE) { Color pix = image.getPixel(x, y); for(int dy = y; dy < y + PIXEL_SIZE; dy++) { for(int dx = x; dx < x + PIXEL_SIZE; dx++) { if( dx < width && dy < height ) image.setPixel(dx, dy, pix); } } } } } }
6. SmoothFilter
import java.awt.Color; import java.util.List; import java.util.ArrayList; /** * @author Yasinta Yusniawati * @version EAS/20181210 */ public class SmoothFilter extends Filter { private OFImage original; private int width; private int height; public SmoothFilter(String name) { super(name); } public void apply(OFImage image) { original = new OFImage(image); width = original.getWidth(); height = original.getHeight(); for(int y = 0; y < height; y++) { for(int x = 0; x < width; x++) { image.setPixel(x, y, smooth(x, y)); } } } private Color smooth(int xpos, int ypos) { List<Color> pixels = new ArrayList<Color>(9); for(int y = ypos - 1; y <= ypos + 1; y++) { for(int x = xpos - 1; x <= xpos + 1; x++) { if( x >= 0 && x < width && y >= 0 && y < height ) pixels.add(original.getPixel(x, y)); } } return new Color(avgRed(pixels), avgGreen(pixels), avgBlue(pixels)); } private int avgRed(List<Color> pixels) { int total = 0; for(Color color : pixels) { total += color.getRed(); } return total / pixels.size(); } private int avgGreen(List<Color> pixels) { int total = 0; for(Color color : pixels) { total += color.getGreen(); } return total / pixels.size(); } private int avgBlue(List<Color> pixels) { int total = 0; for(Color color : pixels) { total += color.getBlue(); } return total / pixels.size(); } }
7. ThresholdFilter
import java.awt.Color; /** * Yasinta Yusniawati * 05111740000054 * PBO - B */ 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); } } } } }
8. InvertFilter
import java.awt.Color; /** * Yasinta Yusniawati * 05111740000054 * PBO - B */ public class InvertFilter extends Filter { public InvertFilter(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 pix = image.getPixel(x, y); image.setPixel(x, y, new Color(255 - pix.getRed(), 255 - pix.getGreen(), 255 - pix.getBlue())); } } } }
9. GrayScaleFilter
import java.awt.Color; /** * Yasinta Yusniawati * 05111740000054 * PBO - B */ public class GrayScaleFilter extends Filter { public GrayScaleFilter(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 pix = image.getPixel(x, y); int avg = (pix.getRed() + pix.getGreen() + pix.getBlue()) / 3; image.setPixel(x, y, new Color(avg, avg, avg)); } } } }
10. SolarizeFilter
import java.awt.Color; /** * Yasinta Yusniawati * 05111740000054 * PBO - B */ public class SolarizeFilter extends Filter { public SolarizeFilter(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 pix = image.getPixel(x, y); int red = pix.getRed(); if(red <= 127) { red = 255 - red; } int green = pix.getGreen(); if(green <= 127) { green = 255 - green; } int blue = pix.getBlue(); if(blue <= 127) { blue = 255 - blue; } image.setPixel(x, y, new Color(red, green, blue)); } } } }
11. LighterFilter
/** * Yasinta Yusniawati * 05111740000054 * PBO - B */ 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()); } } } }
12. MirrorFilter
import java.awt.Color; /** * Yasinta Yusniawati * 05111740000054 * PBO - B */ public class MirrorFilter extends Filter { public MirrorFilter(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 / 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); } } } }
13. FishEyeFilter
import java.awt.Color; /** *Yasinta Yusniawati * 05111740000054 * PBO - B */ public class FishEyeFilter extends Filter { private final static int SCALE = 20; private final static double TWO_PI = 2 * Math.PI; public FishEyeFilter(String name) { super(name); } 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])); } } } 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; } 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; } }
14. DarkerFilter
/** * Yasinta Yusniawati * 05111740000054 * PBO - B */ 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()); } } } }
15. EdgeFilter
import java.awt.Color; import java.util.List; import java.util.ArrayList; /** * @author Yasinta Yusniawati * @version EAS/20181210 */ public class EdgeFilter extends Filter { private static final int TOLERANCE = 20; private OFImage original; private int width; private int height; public EdgeFilter(String name) { super(name); } public void apply(OFImage image) { original = new OFImage(image); width = original.getWidth(); height = original.getHeight(); for(int y = 0; y < height; y++) { for(int x = 0; x < width; x++) { image.setPixel(x, y, edge(x, y)); } } } private Color edge(int xpos, int ypos) { List<Color> pixels = new ArrayList<Color>(9); for(int y = ypos-1; y <= ypos+1; y++) { for(int x = xpos-1; x <= xpos+1; x++) { if( x >= 0 && x < width && y >= 0 && y < height ) { pixels.add(original.getPixel(x, y)); } } } return new Color(255 - diffRed(pixels), 255 - diffGreen(pixels), 255 - diffBlue(pixels)); } private int diffRed(List<Color> pixels) { int max = 0; int min = 255; for(Color color : pixels) { int val = color.getRed(); if(val > max) { max = val; } if(val < min) { min = val; } } int difference = max - min - TOLERANCE; if(difference < 0) { difference = 0; } return difference; } private int diffGreen(List<Color> pixels) { int max = 0; int min = 255; for(Color color : pixels) { int val = color.getGreen(); if(val > max) { max = val; } if(val < min) { min = val; } } int difference = max - min - TOLERANCE; if(difference < 0) { difference = 0; } return difference; } private int diffBlue(List<Color> pixels) { int max = 0; int min = 255; for(Color color : pixels) { int val = color.getBlue(); if(val > max) { max = val; } if(val < min) { min = val; } } int difference = max - min - TOLERANCE; if(difference < 0) { difference = 0; } return difference; } }
16. Filter
/** * @author Yasinta Yusniawati * @version EAS/20181210 */ 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); }
4) SCREEN SHOT
Gambar Asli
Filter Mirror
Zoom In
Rotate 180 derajat
Add Text