EVALUASI AKHIR SEMESTER PBO
MEMBUAT IMAGE EDITOR DENGAN BLUE J
Nama : Karina Soraya Puspitasari
NRP : 05111740000003
Kelas : PBO - B
1. Rancangan Interface image editor saya sebagai berikut :
Kemudian, pada bagian effect akan ditambahkan darker, lighter, fish eye, pixel, mirror, dan sebagainya.
- Fish Eye Filter : membuat filter fish eye
- Lighter Filter : membuat filter lighter
- Pixelize Filter : membuat filter pixel
- Darker Filter : membuat filter darker
- Threshold Filter : membuat filter threshold
- Solarize Filter : membuat filter solarize
- Edge Filter : membuat filter edge
- Invert Filter : membuat filter invert
- Mirror Filter : membuat filter mirror
- Smooth Filter : membuat filter smooth
- Gray Scale Filter : membuat filter gray scale
- Filter : abstrak untuk semua filter gambar
- OF Image : mendefinisikan sebuah gambar dalam format OF
- Image Panel : komponen swing yang dapat menampilkan OFImage
- Image Viewer : kelas utama dari Image Viewer
- Image File Manager : untuk memuat dan menyimpan gambar
3. Mengimplementasikan Program Image Editor
- Source Code Fish Eye Filter
import java.awt.Color;
/**
* An image filter to create an effect similar to a fisheye camera lens.
* (Works especially well on portraits.)
*
* @author Karina Soraya P
* @version 1.10/20181126
*/
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;
}
}
- Source Code Lighter Filter
/**
* An image filter to make the image a bit lighter.
*
* @author Karina Soraya P
* @version 1.2/20181126
*/
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());
}
}
}
}
- Source Code Pixelize Filter
import java.awt.Color;
/**
* An image filter to create a pixelization effect, like an enlarged
* low-resolution digital image.
*
* @author Karina Soraya P
* @version 1.14/20181126
*/
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);
}
}
}
}
}
}
- Source Code Darker Filter
/**
* An image filter to make the image a bit darker.
*
* @author Karina Soraya P
* @version 1.3/20181126
*/
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());
}
}
}
}
- Source Code Threshold Filter
import java.awt.Color;
/**
* An three-level gray-based threshold filter.
*
* @author Karina Soraya P
* @version 1.1/20181126
*/
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);
}
}
}
}
}
- Source Code Solarize Filter
/**
* An image filter to create a solarization effect.
*
* @author Karina Soraya P
* @version 1.16/20181126
*/
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));
}
}
}
}
- Source Code Edge Filter
import java.awt.Color;
import java.util.List;
import java.util.ArrayList;
/**
* An image filter to detect edges and highlight them, a bit like
* a colored pencil drawing.
*
* @author Karina Soraya P
* @version 1.9/20181126
*/
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;
}
}
- Source Code Invert Filter
import java.awt.Color;
/**
* An image filter to invert colors.
*
* @author Karina Soraya P
* @version 1.12/20181126
*/
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()));
}
}
}
}
- Source Code Mirror Filter
import java.awt.Color;
/**
* An image filter to mirror (flip) the image horizontally.
*
* @author Karina Soraya P
* @version 1.13/20181126
*/
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);
}
}
}
}
- Source Code Smooth Filter
import java.awt.Color;
import java.util.List;
import java.util.ArrayList;
/**
* An image filter to reduce sharp edges and pixelization. A bit like
* a soft lens.
*
* @author Karina Soraya P
* @version 1.15/20181126
*/
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();
}
}
- Source Code Gray Scale Filter
import java.awt.Color;
/**
* An image filter to remove color from an image.
*
* @author Karina Soraya P
* @version 1.11/20181126
*/
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));
}
}
}
}
- Source Code Filter
/**
* Filter is an abstract superclass for all image filters in this
* application. Filters can be applied to OFImages by invoking the apply
* method.
*
* @author Karina Soraya P
* @version 1.4/20181126
*/
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);
}
- Source Code OF Image
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
/**
* OFImage is a class that defines an image in OF (Objects First) format.
*
* @author Karina Soraya P
* @version 1.0/20181126
*/
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);
}
}
- Source Code Image Panel
import java.awt.*;
import javax.swing.*;
import java.awt.image.*;
/**
* An ImagePanel is a Swing component that can display an OFImage.
* It is constructed as a subclass of JComponent with the added functionality
* of setting an OFImage that will be displayed on the surface of this
* component.
*
* @author Karina Soraya P
* @version 1.6/20181126
*/
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);
}
}
}
- Source Code Image File Manager
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
/**
* ImageFileManager is a small utility class with static methods to load
* and save images.
*
* The files on disk can be in JPG or PNG image format. For files written
* by this class, the format is determined by the constant IMAGE_FORMAT.
*
* @author Karina Soraya P
* @version 1.5/20181126
*/
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;
}
}
}
- Source Code Image Viewer
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.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
/**
* 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 Karina Soraya P
* @version 1.7/20181126
*/
public class ImageViewer
{
private static final String VERSION = "Version 3.1";
private static JFileChooser fileChooser = new JFileChooser(System.getProperty("user.dir"));
private JFrame frame;
private ImagePanel imagePanel;
private JLabel filenameLabel;
private JLabel statusLabel;
private JButton smallerButton;
private JButton textButton;
private JButton largerButton;
private JButton cropButton;
private JButton rotButton;
private JButton rotaButton;
private JButton rotateButton;
private OFImage currentImage;
private List<Filter> filters;
public ImageViewer()
{
currentImage = null;
filters = createFilters();
makeFrame();
}
private void makeText()
{
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("Besar Font"));
String addText = JOptionPane.showInputDialog("Ketik sesuatu..");
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);
}
}
Graphics g = newImage.getGraphics();
g.setFont(g.getFont().deriveFont(fontSize));
g.drawString(addText, xPosition, yPosition);
g.dispose();
currentImage = newImage;
imagePanel.setImage(currentImage);
}
}
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);
setButtonsEnabled(true);
showFilename(selectedFile.getPath());
showStatus("File loaded.");
frame.pack();
}
private void close()
{
currentImage = null;
imagePanel.clearImage();
showFilename(null);
setButtonsEnabled(false);
}
private void saveAs()
{
if(currentImage != null) {
int returnVal = fileChooser.showSaveDialog(frame);
if(returnVal != JFileChooser.APPROVE_OPTION) {
return;
}
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) {
int width = currentImage.getWidth();
int height = currentImage.getHeight();
OFImage newImage = new OFImage(width * 2, height * 2);
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) {
int width = currentImage.getWidth() / 2;
int height = currentImage.getHeight() / 2;
OFImage newImage = new OFImage(width, height);
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 crop()
{
if (currentImage != null)
{
int width = currentImage.getWidth();
int height = currentImage.getWidth();
int xAwal = Integer.parseInt(JOptionPane.showInputDialog("x.akhir"));
int yAwal = Integer.parseInt(JOptionPane.showInputDialog("y.akhir"));
int xAkhir = Integer.parseInt(JOptionPane.showInputDialog("x.awal"));
int yAkhir = Integer.parseInt(JOptionPane.showInputDialog("y.awal"));
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 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 setButtonsEnabled(boolean status)
{
smallerButton.setEnabled(status);
largerButton.setEnabled(status);
cropButton.setEnabled(status);
rotButton.setEnabled(status);
rotaButton.setEnabled(status);
rotateButton.setEnabled(status);
}
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 makeFrame()
{
frame = new JFrame("ImageViewer");
JPanel contentPane = (JPanel)frame.getContentPane();
contentPane.setBorder(new EmptyBorder(6, 6, 6, 6));
makeMenuBar(frame);
contentPane.setLayout(new BorderLayout(6, 6));
imagePanel = new ImagePanel();
imagePanel.setBorder(new EtchedBorder());
contentPane.add(imagePanel, BorderLayout.CENTER);
filenameLabel = new JLabel();
contentPane.add(filenameLabel, BorderLayout.NORTH);
statusLabel = new JLabel(VERSION);
contentPane.add(statusLabel, BorderLayout.SOUTH);
JPanel toolbar = new JPanel();
toolbar.setLayout(new GridLayout(0, 1));
textButton = new JButton("Add Text");
textButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { makeText();}
});
toolbar.add(textButton);
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);
rotateButton = new JButton("Rotate 180");
rotateButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { Rotate180(); }
});
toolbar.add(rotateButton);
rotButton = new JButton("Rotate 90 Left");
rotButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { Rotate90left(); }
});
toolbar.add(rotButton);
rotaButton = new JButton("Rotate 90 Right");
rotaButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { Rotate90right(); }
});
toolbar.add(rotaButton);
JPanel flow = new JPanel();
flow.add(toolbar);
contentPane.add(flow, BorderLayout.WEST);
showFilename(null);
setButtonsEnabled(false);
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 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();
}
}
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("Effect");
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);
}
// 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);
}
}
- Hasil
Tampilan awal
Open file yang akan kita edit
Ketika menggunakan smaller, tampilan Image Viewer akan mengecil
Ketika menggunakan rotate 180
Ketika menggunakan rotate 90 left
Ketika menggunakan effect mirror
Ketika menggunakan efect fish eye
Ketika menambahkan teks dengan posisi x : 200, y : 300, font size : 50
Ketika menggunakan crop
Ketika menggunakan effect darker
Ketika menggunakan effect edge detection
Ketika menggunakan effect invert
Ketika menggunakan effect invert + lighter
Ketika menggunakan effect solarize + smooth
Ketika menggunakan effect solarize + pixel
Ketika menggunakan effect solarize
Ketika menggunakan effect gray scale
Komentar
Posting Komentar