GRAFIKA DAN MULTIMEDIA KOMPUTER Program Aplikasi Pengolahan Citra
“AsApp”
Nama Nim Kelas
: : :
Anita Sarnita Suriani 42514021 D4 TKJ 2A
Jurusan Teknik Elektro Program Studi D4 Teknik Komputer dan Jaringan Politeknik Negeri Ujung Pandang 2016
BAB I PENDAHULUAN
A. Latar Belakang Dewasa ini, antusiasme masyarakat dunia terhadap foto/gambar semakin meningkat. Orang-orang mengambil gambar lingkungan bahkan dirinya sendiri hampir disetiap kesehariannya. Kebiasaan ini didukung dengan makin canggih dan beragamnya kamera dan alat pengambil gambar lainnya. Tidak hanya itu saja, sering kali manusia belum merasa cukup dengan gambar yang diperolehnya. Untuk itu, berbagai aplikasi pengolah gambar/citra baik yang berbasis web maupun android pun diciptakan dan dikembangkan untuk memenuhi kebutuhan dan hasrat manusia terhadap nilai seni gambar. Atas dasar ini, cukup penting untuk mengenal dan memahami berbagai bentuk operasi hingga tool pengolahan gambar. Untuk mengenal tool-toolnya dapat dilakukan dengan sering-sering menggunakan aplikasi pengolahan gambar yang telah ada, sementara untuk lebih memahaminya dapat dilakukan dengan mencoba membuat sendiri aplikasi tersebut, meskipun masih dalam lingkup yang sederhana. B. Tujuan 1. Mahasiswa mengetahui macam-macam operasi dasar pengolahan citra. 2. Mahasiswa mampu membuat aplikasi pengolahan citra.
BAB II TINJAUAN PUSTAKA A. Review Pengolahan Citra Gambar digital adalah gambar yang dihasilkan dari proses oleh gambar dikomputer, kamera, scanner atau perangkat elektronik lainnya.
Pemotretan menggunakan kamera digital atau media lain yang disimpan dalam bentuk file. Image editor ialah aplikasi untuk mengolah sebuah gambar baik gambar raster/bitmap maupun vector. Gambar bitmap atau sering disebut raster terdiri dari sekumpulan titik-titik (piksel) yang membentuk sebuah gambar dan vektor terdiri dari sekumpulan garis dan kurva yang membentuk suatu gambar. B. Review Materi Citra digital direpresentasikan dengan matriks sehingga operasi pada citra digital pada dasarnya memanipulasi elemen-elemen matriks. Operasi dasar pengolahan citra antara lain : operasi titik, operasi global, operasi berbasis bingkai (frame), operasi geometri, dan operasi bertetangga. OPERASI TITIK Titik pada citra memiliki 2 karakteristik yaitu :
Koordinat yang menunjukkan lokasi dari titik tersebut dalam citra. Nilai yg menunjukan tingkat keabuan/warna dari titik tersebut. Operasi titik dilakukan dengan memodifikasi nilai skala keabuan dari
titik (piksel) yang ditinjau berdasarkan fungsi tertentu. Fungsi yang digunakan adalah fungsi transformasi skala keabuan (gray scale transformation/GST). GST function = fungsi yang memetakan tingkat keabuan input (Ki) ke citra keabuan citra output (Ko) Ko = f (Ki) Untuk citra true color fungsi ini diterapkan pada ketiga elemen warna : Ro = fR (Ri) Go = fG (Gi) Bo = fB (Bi) Beberapa operasi pengolahan citra, terkait operasi titik : 1. Modifikasi kecemerlangan (brightness modification) 2. Peningkatan Kontras (contrast enhancement) 3. Negasi (negation) 4. Grayscale 5. Pengambangan (thresholding)
OPERASI GEOMETRI
Operasi
Geometri
pada
pengolahan
memodifikasi koordinat piksel dalam suatu tertentu,
tetapi
dalam
citra
citra
perkembangannya
ditujukan
dengan
untuk
pendekatan
dimungkinkan
juga
memodifikasi nilai skala keabuan. Operasi Geometri berhubungan dengan perubahan bentuk geometri citra, antara lain : 1. 2. 3. 4.
Pencerminan (flipping) Rotasi/pemutaran (Rotating) Pemotongan (Cropping) Penskalaan (Scaling/Zooming)
OPERASI BERBASIS BINGKAI (FRAME) = OPERASI MULTI IMAGE Operasi multi image adalah operasi pengolahan terhadap lebih dari
satu
obyek
citra
dan menghasilkan sebuah citra keluaran yang
merupakan hasil operasi matematis. Operasi ini dilakukan titik per titik dengan lokasi yang bersesuaian pada citra-citra masukan. Secara umum misal akan dioperasikan citra A dan citra B sehingga menghasilkan citra C, maka dapat diformulasikan sbb : C(x,y) = A(x,y) operator B(x,y) Jika melibatkan lebih dari 2 citra, maka : C(x,y) = A1(x,y) operator A2(x,y) operator A3(x,y)……… Dalam
operasi
yang
melibatkan
dua
buah
citra
atau
lebih,
biasanya akan diterapkan operasi aritmatika, sebagai contoh : Penjumlahan C(x,y) = A(x,y) + B(x,y) Pengurangan Perkalian
C(x,y) = A(x,y) – B(x,y) C(x,y) = A(x,y) * B(x,y)
Pembagian C(x,y) = A(x,y) / B(x,y) Beberapa pengolahan citra yang berkaitan dengan operasi ini adalah : 1. Penggabungan citra (image blending) 2. Deteksi gerakan (motion detection) 3. Operasi Logika (logic Operation)
OPERASI BERTETANGGA / PERSEKITARAN (Neighborhood Operation) Sebuah citra yang ideal, apabila mampu mencerminkan kondisi sesungguhnya dari suatu obyek. Mempunyai hubungan satu-satu (one to one), satu titik pada obyek dipetakan tepat satu pixel di citra digital. Tetapi pada kenyataannya, hubungan yang ada antara titik dalam obyek dengan titik pada citra digital adalah hubungan satu ke banyak (one to many) dan banyak ke satu (many to one). Ini dikarenakan sinyal yang dikirim oleh obyek citra mengalami penyebaran (divergensi), sehingga yang diterima oleh sensor atau detector tidak lagi berupa suatu titik, namun berupa luasan. Atau sebaliknya satu titik pada sensor atau detector dapat menerima banyak sinyal dari bebrapa bagian. Operasi persekitaran/bertetangga pada dasarnya adalah hubungan antara citra dengan sebuah filter (mask / kernel). Nilai dari filter/mask merupakan bobot kontribusi titik persekitaran terhadap operasi persekitaran. Beberapa pengolahan citra yang berkaitan dengan operasi ini adalah : 1. 2. 3. 4. 5.
Deteksi Tepi (Edge Detection) Penghalusan Citra (Smoothing) Penajaman Citra (Sharping) Reduksi Noise Efek Emboss
BAB III PEMBAHASAN A. Implementasi design Tampilan Program AsApp
Analisa : Program ini dibuat menggunakan bahasa pemrograman Java melalui aplikasi NetBeans IDE 8.0. Memanfaatkan fitur GUI, program ini didesain sedemikian rupa hingga menghasilkan tampilan seperti gambar di atas. Adapun tampilan ini masih jauh dari kesempurnaan, dan masih membutuhkan lebih banyak perbaikan dan perkembangan. B. Pengujian Program Penginputan Gambar
Analisa : Untuk mengimput sebuah gambar, dapat dilakukan dengan menekan Open File pada bar Picture ataupun dengan langsung menekan ctrl+O, hingga muncul jendela browser untuk memilih gambar yang ada pada file komputer. Adapun gambar yang dapat diinput adalah gambar yang berekstensi PNG atau JPG. Ini dibuat menggunakan variabel jFileChooser. Gambar Terinput
Analisa : Gambar yang telah diinput akan langsung berada pada posisi label yang telah diatur.
Left Rotate
Right Rotate
Analisa : Rotasi citra termasuk dalam operasi geometri yang dilakukan dengan memodifikasi koordinat pixel suatu gambar/citra. Operasi rotasi pada program ini melakukan perputaran sebanyak 90 derajat searah jarum jam (CW) dan 90 derajat berlawanan arah jarum jam (CCW).
Zoom In
Zoom Out
Analisa : Untuk operasi zoom, dilakukan pengubahan ukuran gambar. Untuk tombol zoom in, setiap kali ditekan maka akan menghasilkan ukuran gambar 5% lebih besar dari ukuran gambar sebelumnya. Adapun tombol zoom out, setiap kali ditekan maka menghasilkan ukuran gambar yang 5% lebih kecil dari ukuran gambar sebelumnya.
Translation
Analisa : Operasi translation memungkinkan gambar untuk diseret ke segala penjuru label menggunkan pointer. Pada NetBeans, operasi ini dapat dijalankan cukup dengan melakukan sistem dragged and dropped. Horizontal Flip
Vertical Flip
Analisa : Flipping atau pencerminan citra juga merupakan salah satu operasi geometri. Untuk percerminan horisontal gambar dicerminkan pada sumbu Y, sedangkan pencerminan vertikal mencerminkan gambar pada sumbu X. Adapun nilai untuk pencerminan horisontal adalah -1.0,1.0 dan untuk pencerminan vertikal nilainya adalah 1.0,-1.0. SunRed Effect
Analisa : Untuk menciptakan efek yang menghasilkan gmabar seperti di atas, dilakukan pengaturan tertentu untuk nilai contrast, brighteness, dan tingkat warna dasar (red, green, blue). Nilai contrast yaitu 2*(-20)/150, nilai brighteness yaitu 2*155/150. Kedua nilai ini dikalikan 2 dan dibagi 155 agar nilai hasil yang didapatkan adalah
nilai yang relevan. Selanjutnya untuk nilai dasar Red = 55, Green = 30, dan Blue = 15. Tidak ada rumus tertentu untuk penentuan nilai masing-masing. Nilai-nilai tersebut hanya diuji hingga mendapatkan hasil gambar yang sesuai. Clear Effect
Analisa : Untuk efek pada gambar di atas, hanya dilakukan penentuan untuk nilai contras dan brighteness saja. Nilai contrast yaitu 2*(10)/150, nilai brighteness yaitu 2*120/150. Efek ini ditujukan untuk membuat gambar terkesan lebih cerah dan bersih. Efek ini lebih sesuai digunakan untuk gambar-gambar dengan banyak objek seperti gambar pedesaan atau gambar pemandangan lainnya. Contrast In
Contrast Out
Analisa : Kontras merupakan salah satu macam operasi titik, yang mempengaruhi titik yang gelap (bukan hitam) dan titik yang terang (bukan putih). Titik yang gelap akan dibuat semakin gelap dan titik yang terang akn dibuat semakin terang. nilai kontras 190 diolah ke rumus faktornya, adapun nilai RGB dipertahankan. Untuk contrast in, setiap kali ditekan kontras gambar akan meningkat 0.1f dari sebelumnya, dan untuk contrast out, setiap kali ditekan kontras akan berkurang 0.1f. Gambar di atas menunjukkan hasil gambar setelah tombol contrast in ditekan sekali dan juga untuk tombol contrast out ditekan sekali. Brightness In
Brightness Out
Analisa : Kecemerlangan (brightness) merupakan bentuk operasi titik yang mengubah titik gelap ke terang dan gerang ke gelap. Pada dasarnya, kecemerlangan bekerja dengan
menggeser
histogram.
Untuk
brightness
in,
setiap
kali
ditekan
kecemerlangan gambar akan meningkat 0.5f dari sebelumnya, dan untuk brightness out, setiap kali ditekan kecemerlangan akan berkurang 0.5f. Gambar di atas menunjukkan hasil perubahan gambar saat brightness in dan brightness out masingmasing ditekan sekali. Sharp
Analisa : Sharping atau penajaman citra termasuk dlam operasi bertetangga, yang menjumlahkan nilai tepi dengan citra aslinya. Sehingga bagian tepi citra terlihat lebih tajam. Gray
Analisa : Grayscale merupakan bentuk operasi titik yang mengkonversi warna citra menjadi citra keabuan (secara keseluruhan) dengan dipengaruhi oleh faktor nilai GRB citra tersebut . Inverse
Analisa : Inverse/ negasi merupakan bentuk operasi titik untuk mendapatkan nilai negatif dari citra, dimana titik citra yang berwarna terang dibuat menjadi berwarna
hitam, dan titik gelap citra dibuat menjadi putih. Negasi mengurangi nilai intensitas piksel dari nilai keabuan tertingginya. Pada histogramnya, terlihat bahwa operasi ini membalikkan bentuk histogram dar citra tersebut. Threshold
Analisa : Thresholding/pengambangan yaitu operasi titik yang membuat citra ke dalam nilai pasti yaitu 0 dan 1. Gambar yang dianggap terang dibuat menjadi berwarna putih, sementara gambar yang dianggap/mendekali gelap dibuat menjadi berwarna hitam. Intinya piksel-piksel dipisahkan berdasarkan derajat keabuan yang dimilikinya. Piksel yang memiliki derajat keabuan lebih kecil dari nilai batas yang ditentukan akan diberikan nilai 0, sementara piksel yang memiliki derajat keabuan yang lebih besar dari batas akan diubah menjadi bernilai 1. Pada program ini, GRB citra yang nilainya secara biner kurang dari 128 menjadi 255 (hitam) dan yang nilainya lebih dari 128 menjadi 0 (putih). Edge
Analisa : Deteksi tepi juga merupakan bentuk dari operasi bertetangga, dimana ditentukan titik-titik yang merupakan tepi (titik dengan perbedaan warna yang cukup besar dibandingkan titik disebelahnya) dari objek citra. Operasi ini mengubah bagian yang diaanggap sebagai titik tepi menjadi warna putih, sementara yang lainnya berwarna hitam. Blend Image
Analisa : Image Blending atau penggabungan citra termasuk dalam operasi berbasis bingkai/frame dengan sistem multi image. Pada operasi penggabungan citra, gambar yang telah diinput digabungkan dengan gambar baru dengan cara ditimpakan. Hanya saja gambar kedua dibuat lebih transparan sehingga tidak menutupi bagian dari gambar yang pertama. Nilai transparansinya dalah 0.5F.
BAB IV PENUTUP A. Kesimpulan Pada
dasarnya
pemanipulasian
pengolahan
elemen-elemen
citra
merupakan
matriks
dari
presentasi citra
dari
tersebut.
Pemanipulasian/pengolahan cintra ini dapat dilakukan dengan beberapa operasi-operasi pengolahan citra. Pengolahan citra biasanya dilakukan untuk memperbaiki ataupun memperindah suatu gambar sehingga memiliki nilai seni yang lebih tinggi dan terlihat lebih menarik. Kini, sudah tersedia sangat banyak aplikasi pengolahan citra yang dapat digunakan dengan mudah untuk mendapatkan citra gambar yang sesuai keinginan. Adapun belajar membuat aplikasi pengolahan citra sederhana seperti ini dapat membantu kita untuk lebih memahami algoritmaalgoritma yang digunakan untuk membuat setiap tool pengolah citra, sehingga kita bisa lebih paham akan kegunaan dan manfaat tiap-tiap tool tersebut. B. Saran Dalam membuat program, haruslah dengan tetap memperhatikan efektifitas dan efisiensinya, agar program tersebut dapat berfungsi dengan baik dan memberikan manfaat yang besar. Program aplikasi AsApp ini masih jauh dari kesemprnaan, untuk itu berbagai kritik dan saran yang membangun sangat diharapkan untuk peningkatan dan kesempurnaan aplikasi ini.
C. Source Code Program Aplikasi “AsApp” package geometri; import java.awt.AlphaComposite; import java.awt.Color; import javax.swing.UIManager; import java.awt.Graphics2D; import java.awt.Point; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.awt.image.ConvolveOp; import java.awt.image.Kernel; import java.awt.image.RescaleOp; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JFileChooser; import javax.swing.filechooser.FileNameExtensionFilter; public class GeometriApp extends javax.swing.JFrame { //OPERASI GEOMETRI public BufferedImage GFlipHor(BufferedImage src){ //scale,translate, transform,filter AffineTransform tx=AffineTransform.getScaleInstance(-1.0,1.0); tx.translate(-src.getWidth(),0); AffineTransformOp tr=new AffineTransformOp(tx,null); return tr.filter(src, null); } public BufferedImage GFlipVer(BufferedImage src){ //scale,translate, transform,filter AffineTransform tx=AffineTransform.getScaleInstance(1.0,-1.0); tx.translate(0,-src.getHeight()); AffineTransformOp tr=new AffineTransformOp(tx,null); return tr.filter(src, null); } void GRotate(){ double theta = Math.toRadians(rotasiint); double cos = Math.abs(Math.cos(theta));
double sin = Math.abs(Math.sin(theta)); int width = image.getWidth(); int height = image.getHeight(); int w = (int)(width * cos + height * sin); int h = (int)(width * sin + height * cos); BufferedImage out = new BufferedImage(w, h, image.getType()); Graphics2D g2 = out.createGraphics(); g2.setPaint(UIManager.getColor("Panel.background")); g2.fillRect(0,0,w,h); double x = w/2; double y = h/2; AffineTransform at = AffineTransform.getRotateInstance(theta, x, y); x = (w - width)/2; y = (h - height)/2; at.translate(x, y); g2.drawRenderedImage(image, at); g2.dispose(); take.setIcon(new ImageIcon(out)); } public void Scale(){ URL file1 = this.getClass().getResource("/geometri/add.jpg"); String file = Chooser.getCurrentDirectory()+"/"+"add.jpg"; try { GeometriApp.make(url, file, Width, Height); image = ImageIO.read(new File(file)); } catch (IOException ex) { Logger.getLogger(GeometriApp.class.getName()).log(Level.SEVERE, null, ex); } repaint(); } //OPERASI TITIK public void TGray(int Pixel) { int A = (Pixel >> 24) & 0xff; int R = (Pixel >> 16) & 0xff; int G = (Pixel >> 8) & 0xff; int B = (Pixel) & 0xff; int newpixel = R+G+B; newpixel = newpixel / 3; Gray = new Color(newpixel, newpixel, newpixel); } public void TThreshold(int pixel) { int A = (pixel >> 24) & 0xff; int R = (pixel >> 16) & 0xff; int G = (pixel >> 8) & 0xff;
int B = (pixel) & 0xff; int newpixel = R+G+B; newpixel = newpixel / 3; Treshold = new Color(newpixel, newpixel, newpixel); } public void TInverse(int pixel) { int A = (pixel >> 24) & 0xff; int R = (pixel >> 16) & 0xff; int G = (pixel >> 8) & 0xff; int B = (pixel) & 0xff; Inverse = new Color(255-R, 255-G, 255-B); } public void TContrast(int pixel) { int A = (pixel >> 24) & 0xff; int R = (pixel >> 16) & 0xff; int G = (pixel >> 8) & 0xff; int B = (pixel) & 0xff; int contrast = 190; float factor = (259 * (contrast + 255)) / (255 * (259 - contrast)); int newRed = Math.round(factor * (R - 128) + 128); if (newRed > 255){ newRed = 255; } if (newRed < 0){ newRed = 0; } int newGreen = Math.round(factor * (G - 128) + 128); if (newGreen > 255){ newGreen = 255; } if (newGreen < 0){ newGreen = 0; } int newBlue = Math.round(factor * (B - 128) + 128); if (newBlue > 255){ newBlue = 255; } if (newBlue < 0){ newBlue = 0; } Contrast = new Color(newRed, newGreen, newBlue); } // INISIALISASI BufferedImage image, Src, Dest, Ot, SharpImage, EdgeImage, BlendImage, NewImage; JFileChooser Chooser = new JFileChooser(); JFileChooser BlendChooser = new JFileChooser();
Color Brightness,Treshold,Inverse,Contrast,Gray; Point Click; Graphics2D Add; RescaleOp Rescale; String url, blend; float Scale = 1.0f, Brighten, Offset = 10; int Width, Height, per, rotasiint; boolean bright, contrast; public GeometriApp() { initComponents(); } public void BufferedImageAdd(){ Src = new BufferedImage(image.getWidth(this),image.getHeight(this),BufferedImage.TY PE_INT_RGB); Add = Src.createGraphics(); Add.drawImage(image, 0, 0, this); Dest = new BufferedImage(image.getWidth(this),image.getHeight(this),BufferedImage.TY PE_INT_RGB); Ot = Src; } public void ChangeOffSet() { if (bright) { if (Offset < 255) Offset = Offset+5.0f; } else { if (Offset > 0) Offset = Offset-5.0f; } } public void CScale() { if (contrast) { if (Scale < 255) Scale = Scale+0.1f; } else { if (Scale > 0) Scale = Scale-0.1f; } } public void Rescale() {
Rescale = new RescaleOp(Scale, Offset, null); Rescale.filter(Src, Dest); Ot = Dest; } public static void make(String inputImagePath, String outputImagePath, int scaledWidth, int scaledHeight) throws IOException { File inputFile = new File(inputImagePath); BufferedImage inputImage = ImageIO.read(inputFile); BufferedImage outputImage = new BufferedImage(scaledWidth, scaledHeight, inputImage.getType()); Graphics2D g2d = outputImage.createGraphics(); g2d.drawImage(inputImage, 0, 0, scaledWidth, scaledHeight, null); g2d.dispose(); String formatName = outputImagePath.substring(outputImagePath.lastIndexOf(".") + 1); ImageIO.write(outputImage, formatName, new File(outputImagePath)); } public static void make(String inputImagePath, String outputImagePath, double percent) throws IOException { File inputFile = new File(inputImagePath); BufferedImage inputImage = ImageIO.read(inputFile); int scaledWidth = (int) (inputImage.getWidth() * percent); int scaledHeight = (int) (inputImage.getHeight() * percent); make(inputImagePath, outputImagePath, scaledWidth, scaledHeight); } @SuppressWarnings("unchecked") // private void initComponents() { LeftRotate = new javax.swing.JButton(); RightRotate = new javax.swing.JButton(); HorizontalFlip = new javax.swing.JButton(); VerticalFlip = new javax.swing.JButton(); ZoomIn = new javax.swing.JButton(); ZoomOut = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); take = new javax.swing.JLabel(); Grayb = new javax.swing.JButton(); ContrasPlus = new javax.swing.JButton(); Invers = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); SunEffect = new javax.swing.JButton(); Edge = new javax.swing.JButton(); ClearEffect = new javax.swing.JButton(); Threshold = new javax.swing.JButton(); ContrastMunus = new javax.swing.JButton();
jLabel3 = new javax.swing.JLabel(); BrightnessPlus = new javax.swing.JButton(); BirghtnessMinus = new javax.swing.JButton(); Sharp = new javax.swing.JButton(); Blend = new javax.swing.JButton(); jLabel2 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); jMenuBar1 = new javax.swing.JMenuBar(); jMenu1 = new javax.swing.JMenu(); jMenuItem1 = new javax.swing.JMenuItem();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); LeftRotate.setIcon(new javax.swing.ImageIcon("F:\\ANITA SURIANI\\POLITEKNIK\\TEKNIK KOMPUTER dan JARINGAN\\PICTURES\\GRAFIKA KOMPUTER DAN MULTIMEDIA\\rotatel.JPG")); // NOI18N LeftRotate.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { LeftRotateActionPerformed(evt); } }); RightRotate.setIcon(new javax.swing.ImageIcon("F:\\ANITA SURIANI\\POLITEKNIK\\TEKNIK KOMPUTER dan JARINGAN\\PICTURES\\GRAFIKA KOMPUTER DAN MULTIMEDIA\\rotater.JPG")); // NOI18N RightRotate.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { RightRotateActionPerformed(evt); } }); HorizontalFlip.setIcon(new javax.swing.ImageIcon(getClass().getResource("/geometri/horizontal.PNG"))); // NOI18N HorizontalFlip.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { HorizontalFlipActionPerformed(evt); } });
VerticalFlip.setIcon(new javax.swing.ImageIcon(getClass().getResource("/geometri/vertikall.PNG"))); // NOI18N VerticalFlip.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { VerticalFlipActionPerformed(evt); } }); ZoomIn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/geometri/zoon in.PNG"))); // NOI18N ZoomIn.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ZoomInActionPerformed(evt); } }); ZoomOut.setIcon(new javax.swing.ImageIcon(getClass().getResource("/geometri/xoom out.PNG"))); // NOI18N ZoomOut.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ZoomOutActionPerformed(evt); } }); take.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { public void mouseDragged(java.awt.event.MouseEvent evt) { takeMouseDragged(evt); } }); take.addMouseListener(new java.awt.event.MouseAdapter() { public void mousePressed(java.awt.event.MouseEvent evt) { takeMousePressed(evt); } }); jScrollPane1.setViewportView(take); Grayb.setForeground(new java.awt.Color(0, 204, 255)); Grayb.setText("Gray"); Grayb.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { GraybActionPerformed(evt); } });
ContrasPlus.setIcon(new javax.swing.ImageIcon("F:\\ANITA SURIANI\\POLITEKNIK\\TEKNIK KOMPUTER dan JARINGAN\\PICTURES\\GRAFIKA KOMPUTER DAN MULTIMEDIA\\plus.JPG")); // NOI18N ContrasPlus.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ContrasPlusActionPerformed(evt); } }); Invers.setForeground(new java.awt.Color(255, 0, 204)); Invers.setText("Invers"); Invers.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { InversActionPerformed(evt); } }); jLabel1.setForeground(new java.awt.Color(51, 153, 255)); jLabel1.setText("Brightness"); SunEffect.setIcon(new javax.swing.ImageIcon("F:\\ANITA SURIANI\\POLITEKNIK\\TEKNIK KOMPUTER dan JARINGAN\\PICTURES\\GRAFIKA KOMPUTER DAN MULTIMEDIA\\sun effect.PNG")); // NOI18N SunEffect.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { SunEffectActionPerformed(evt); } }); Edge.setForeground(new java.awt.Color(255, 0, 153)); Edge.setText("Edge"); Edge.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { EdgeActionPerformed(evt); } }); ClearEffect.setIcon(new javax.swing.ImageIcon("F:\\ANITA SURIANI\\POLITEKNIK\\TEKNIK KOMPUTER dan JARINGAN\\PICTURES\\GRAFIKA KOMPUTER DAN MULTIMEDIA\\clear effect.PNG")); // NOI18N ClearEffect.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) {
ClearEffectActionPerformed(evt); } }); Threshold.setForeground(new java.awt.Color(0, 204, 255)); Threshold.setText("Threshold"); Threshold.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ThresholdActionPerformed(evt); } }); ContrastMunus.setIcon(new javax.swing.ImageIcon("F:\\ANITA SURIANI\\POLITEKNIK\\TEKNIK KOMPUTER dan JARINGAN\\PICTURES\\GRAFIKA KOMPUTER DAN MULTIMEDIA\\minus.JPG")); // NOI18N ContrastMunus.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ContrastMunusActionPerformed(evt); } }); jLabel3.setForeground(new java.awt.Color(0, 153, 255)); jLabel3.setText("Contrast"); BrightnessPlus.setIcon(new javax.swing.ImageIcon("F:\\ANITA SURIANI\\POLITEKNIK\\TEKNIK KOMPUTER dan JARINGAN\\PICTURES\\GRAFIKA KOMPUTER DAN MULTIMEDIA\\plus.JPG")); // NOI18N BrightnessPlus.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { BrightnessPlusActionPerformed(evt); } }); BirghtnessMinus.setIcon(new javax.swing.ImageIcon("F:\\ANITA SURIANI\\POLITEKNIK\\TEKNIK KOMPUTER dan JARINGAN\\PICTURES\\GRAFIKA KOMPUTER DAN MULTIMEDIA\\minus.JPG")); // NOI18N BirghtnessMinus.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { BirghtnessMinusActionPerformed(evt); } }); Sharp.setForeground(new java.awt.Color(255, 0, 204));
Sharp.setText("Sharp"); Sharp.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { SharpActionPerformed(evt); } }); Blend.setForeground(new java.awt.Color(0, 102, 0)); Blend.setText("Blend Image"); Blend.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { BlendActionPerformed(evt); } }); jLabel2.setForeground(new java.awt.Color(255, 51, 51)); jLabel2.setText("Effect"); jLabel4.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N jLabel4.setForeground(new java.awt.Color(204, 0, 51)); jLabel4.setText("Filter"); jMenu1.setForeground(new java.awt.Color(255, 0, 204)); jMenu1.setText("Picture"); jMenu1.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseExited(java.awt.event.MouseEvent evt) { jMenu1MouseExited(evt); } });
jMenuItem1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.eve nt.KeyEvent.VK_O, java.awt.event.InputEvent.CTRL_MASK)); jMenuItem1.setForeground(new java.awt.Color(0, 153, 255)); jMenuItem1.setText(" Open File"); jMenuItem1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenuItem1ActionPerformed(evt); } }); jMenu1.add(jMenuItem1); jMenuBar1.add(jMenu1); setJMenuBar(jMenuBar1); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout);
layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LE ADING) .addGroup(layout.createSequentialGroup() .addComponent(LeftRotate, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(RightRotate, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(HorizontalFlip, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(VerticalFlip, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(ZoomIn, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(ZoomOut, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(68, 68, 68) .addComponent(jLabel2) .addGap(18, 18, 18)
.addComponent(SunEffect, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(ClearEffect, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(57, 57, 57) .addComponent(jLabel3) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELAT ED) .addComponent(ContrasPlus, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(ContrastMunus, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(35, 35, 35) .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(BrightnessPlus, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(BirghtnessMinus, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 1003, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LE ADING) .addGroup(layout.createSequentialGroup() .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LE ADING, false) .addComponent(Blend, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(Sharp, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(Grayb, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(Invers, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(Threshold, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(Edge, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addGroup(layout.createSequentialGroup() .addGap(34, 34, 34) .addComponent(jLabel4))) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LE ADING)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LE ADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.T RAILING, false) .addComponent(ZoomOut, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(ZoomIn, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(VerticalFlip, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) .addComponent(HorizontalFlip, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) .addComponent(RightRotate, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) .addComponent(LeftRotate, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LE ADING) .addComponent(ContrasPlus, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(ContrastMunus, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(BirghtnessMinus, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel3) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel1) .addComponent(BrightnessPlus, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE)))) .addComponent(ClearEffect, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(SunEffect, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel2))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELAT ED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LE ADING) .addGroup(layout.createSequentialGroup() .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addComponent(Sharp, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELAT ED) .addComponent(Grayb)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELAT ED) .addComponent(Invers) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELAT ED) .addComponent(Threshold) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELAT ED) .addComponent(Edge) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELAT ED) .addComponent(Blend)) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 452, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(24, Short.MAX_VALUE)) ); pack(); }// private void SliderMouseReleased(java.awt.event.MouseEvent evt) { } private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { // Insert Image FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG,PNG,GIF", "jpg", "gif", "png"); Chooser.setFileFilter(filter); int returnVal = Chooser.showOpenDialog(GeometriApp.this); if (returnVal == JFileChooser.APPROVE_OPTION) { System.out.println("Open Picture : "+ Chooser.getSelectedFile().getName()); System.out.print("Directory : "+Chooser.getCurrentDirectory()); url=Chooser.getCurrentDirectory() +"/"+Chooser.getSelectedFile().getName(); try { image = ImageIO.read(new File(url)); take.setIcon(new ImageIcon(image)); }
catch (IOException ex){ System.out.println("No Picture"); } } } private void LeftRotateActionPerformed(java.awt.event.ActionEvent evt) { // OPERASI GEOMETRI // Left Rotate if (rotasiint - 90 < 0){ rotasiint = 90 - rotasiint; rotasiint = 360 - rotasiint; } else{ rotasiint = rotasiint - 90; } GRotate(); } private void RightRotateActionPerformed(java.awt.event.ActionEvent evt) { // OPERASI GEOMETRI // Right Rotate if (rotasiint + 90 > 360){ rotasiint = 360 - rotasiint; rotasiint = 90 - rotasiint; } else{ rotasiint = rotasiint + 90; } GRotate(); } private void HorizontalFlipActionPerformed(java.awt.event.ActionEvent evt) { // OPERASI GEOMETRI // Flip Horizontal image = GFlipHor(image); take.setIcon(new ImageIcon(image)); } private void VerticalFlipActionPerformed(java.awt.event.ActionEvent evt) { // OPERASI GEOMETRI // Flip Vertical image = GFlipVer(image); take.setIcon(new ImageIcon(image)); } private void ZoomInActionPerformed(java.awt.event.ActionEvent evt) { // OPERASI GEOMETRI // Zoom In
try { ImageIO.write(image, "jpg", new File(Chooser.getCurrentDirectory() +"/"+"tambah.jpg")); String file = Chooser.getCurrentDirectory()+"/"+"tambah.jpg"; int Widhten = image.getWidth()/20; int Heighten = image.getHeight()/20; Width = image.getWidth() + Widhten; Height = image.getHeight() + Heighten; GeometriApp.make(url, file, Width, Height); image = ImageIO.read(new File(file)); take.setSize (Width, Height); take.setIcon(new ImageIcon(image)); } catch (IOException ex) { Logger.getLogger(GeometriApp.class.getName()).log(Level.SEVERE, null, ex); } repaint(); } private void ZoomOutActionPerformed(java.awt.event.ActionEvent evt) { // OPERASI GEOMETRI // Zoom Out String file = Chooser.getCurrentDirectory()+"/"+"tambah.jpg"; try { int WOut = image.getWidth()/20; int HOut = image.getHeight()/20; Width = image.getWidth() - WOut; Height = image.getHeight() - HOut; GeometriApp.make(url, file, Width, Height); image = ImageIO.read(new File(file)); take.setSize(Width,Height); take.setIcon(new ImageIcon(image)); } catch (IOException ex) { Logger.getLogger(GeometriApp.class.getName()).log(Level.SEVERE, null, ex); } repaint(); } private void takeMousePressed(java.awt.event.MouseEvent evt) { // OPERASI GEOMETRI // Translation Click = evt.getPoint(); } private void takeMouseDragged(java.awt.event.MouseEvent evt) { // OPERASI GEOMETRI
//Translation int takex = take.getLocation().x; int takey = take.getLocation().y; int xMoved = (takex + evt.getX()) - (takex + Click.x); int yMoved = (takey + evt.getY()) - (takey + Click.y); int X = takex + xMoved; int Y = takey + yMoved; take.setLocation(X, Y); take.repaint(); } private void GraybActionPerformed(java.awt.event.ActionEvent evt) { // OPERASI TITIK // Gray if(Ot != null) { NewImage = Ot; int w = Ot.getWidth(); int h = Ot.getHeight(); for (int i = 0; i < h; i++){ for (int a = 0; a < w; a++) { int pixel = Ot.getRGB(a, i); TGray(pixel); NewImage.setRGB(a, i, Gray.getRGB()); } } take.setIcon(new ImageIcon(Ot)); }else{ NewImage = image; int w = image.getWidth(); int h = image.getHeight(); for (int i = 0; i < h; i++) { for (int a = 0; a < w; a++) { int pixel = image.getRGB(a, i); TGray(pixel); NewImage.setRGB(a, i, Gray.getRGB()); } } take.setIcon(new ImageIcon(image)); } } private void ContrasPlusActionPerformed(java.awt.event.ActionEvent evt) { // OPERASI TITIK //Contrast Plus contrast = true; BufferedImageAdd();
CScale(); Rescale(); take.setIcon(new ImageIcon(Ot)); } private void jMenu1MouseExited(java.awt.event.MouseEvent evt) { // TODO add your handling code here: } private void InversActionPerformed(java.awt.event.ActionEvent evt) { // OPERASI TITIK // Inverse int w = image.getWidth(); int h = image.getHeight(); for (int i = 0; i < h; i++) { for (int a = 0; a < w; a++) { int pixel = image.getRGB(a, i); TInverse(pixel); image.setRGB(a, i, Inverse.getRGB()); } } take.setIcon(new ImageIcon(image)); } private void SunEffectActionPerformed(java.awt.event.ActionEvent evt) { // THEME // Sun Effect BufferedImage image1 = image; float offset = -20; offset = 2 * offset / 150; float scaleFactor = 115; scaleFactor = 2 * scaleFactor / 150; RescaleOp op = new RescaleOp(scaleFactor, offset, null); image = op.filter(image, image1); int j = image.getWidth(); int k = image.getHeight(); int limit = 90; for (int i = 0, a; i < j; ++i){ for(a = 0; a < k; ++a){ int pixel = image.getRGB(i, a); int A = (pixel >> 24) & 0xff; int R = (pixel >> 16) & 0xff; int G = (pixel >> 8) & 0xff; int B = (pixel) & 0xff; int newRed = R + 55; if (newRed > 255){ newRed = 255;} if (newRed < 0){
newRed = 0;} int newGreen = G + 30; if (newGreen > 255){ newGreen = 255;} if (newGreen < 0){ newGreen = 0;} int newBlue = B + 15; if (newBlue > 255){ newBlue = 255;} if (newBlue < 0){ newBlue = 0;} Contrast = new Color(A, newRed, newGreen, newBlue); image1.setRGB(i, a, Contrast.getRGB()); } } take.setIcon(new ImageIcon(image1)); repaint(); } private void EdgeActionPerformed(java.awt.event.ActionEvent evt) { // OPERASI TETANGGA // Edge try{ ImageIO.write(image, "PNG",new File("E:/"+Chooser.getSelectedFile().getName())); String filein = "E:/"+Chooser.getSelectedFile().getName(); EdgeImage = ImageIO.read(new File(filein)); new File("E:/"+Chooser.getSelectedFile().getName()).delete(); float data[] = {0, -1, 0,-1, 4, -1,0, -1, 0}; Kernel kernel = new Kernel(3,3,data); ConvolveOp convolve = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP,null); image = convolve.filter(image, EdgeImage); take.setIcon(new ImageIcon(image)); } catch (IOException ex) { Logger.getLogger(GeometriApp.class.getName()).log(Level.SEVERE, null, ex); } } private void ClearEffectActionPerformed(java.awt.event.ActionEvent evt) { // THEME // Clear Effect BufferedImage image1 = image; float offset = 10; offset = 2 * offset / 150; float scaleFactor = 120;
scaleFactor = 2 * scaleFactor / 150; RescaleOp op = new RescaleOp(scaleFactor, offset, null); image = op.filter(image, image1); take.setIcon(new ImageIcon(image1)); repaint(); } private void ThresholdActionPerformed(java.awt.event.ActionEvent evt) { // OPERASI TITIK //Thresholding int w = image.getWidth(); int h = image.getHeight(); for(int i = 0, a; i < w; ++i) { for(a = 0; a < h; ++a) { int pixel = image.getRGB(i, a); int alpha = (pixel >> 24) & 0xff; int red = (pixel >> 16) & 0xff; int green = (pixel >> 8) & 0xff; int blue = (pixel) & 0xff; if(128 <= red || 128 <= green || 128 <= blue) { Color color2 = new Color(255, 255, 255, alpha); image.setRGB(i, a, color2.getRGB()); } else { Color color2 = new Color(0, 0, 0, alpha); image.setRGB(i, a, color2.getRGB()); } } } take.setIcon(new ImageIcon(image)); } private void BrightnessPlusActionPerformed(java.awt.event.ActionEvent evt) { // OPERASI TITIK //Brightness Plus bright = true; BufferedImageAdd(); ChangeOffSet(); Rescale(); take.setIcon(new ImageIcon(Ot)); } private void ContrastMunusActionPerformed(java.awt.event.ActionEvent evt) { // OPERASI TITIK //Contrast Minus contrast = false; BufferedImageAdd();
CScale(); Rescale(); take.setIcon(new ImageIcon(Ot)); } private void BirghtnessMinusActionPerformed(java.awt.event.ActionEvent evt) { // OPERASI TITIK //Brightness Minus bright = false; BufferedImageAdd(); ChangeOffSet(); Rescale(); take.setIcon(new ImageIcon(Ot)); } private void SharpActionPerformed(java.awt.event.ActionEvent evt) { // OPERASI TETANGGA // Sharping try{ ImageIO.write(image, "PNG",new File("E:/"+Chooser.getSelectedFile().getName())); String filein = "E:/"+Chooser.getSelectedFile().getName(); SharpImage = ImageIO.read(new File(filein)); new File("E:/"+Chooser.getSelectedFile().getName()).delete(); float[] data = {0, -1, 0,-1, 5, -1,0, -1, 0}; Kernel kernel = new Kernel(3,3,data); ConvolveOp convolve = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP,null); image = convolve.filter(image, SharpImage); } catch (IOException ex) { Logger.getLogger(GeometriApp.class.getName()).log(Level.SEVERE, null, ex); } take.setIcon(new ImageIcon(image)); } private void BlendActionPerformed(java.awt.event.ActionEvent evt) { // OPERASI FRAME // Blend Image FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG PNG GIF Images", "jpg", "gif","png"); BlendChooser.setFileFilter(filter); BlendChooser.setCurrentDirectory(new File (System.getProperty("user.home")+System.getProperty("file.separator")+ "Pictures")); int returnVal = BlendChooser.showOpenDialog(GeometriApp.this);
if(returnVal == JFileChooser.APPROVE_OPTION) { System.out.print("\n Open \nDirectory : "+BlendChooser.getCurrentDirectory()+"\nFilename : "+BlendChooser.getSelectedFile().getName()); blend=BlendChooser.getCurrentDirectory() +"/"+BlendChooser.getSelectedFile().getName(); try { BlendImage = ImageIO.read(new File(blend)); } catch (IOException ex) { System.out.print("Error!"); }Graphics2D g2d = image.createGraphics(); g2d.setComposite(AlphaComposite.SrcOver.derive((float)0.5F)); int Xx = ((image.getWidth()/2) - (BlendImage.getWidth()/2)); int Yy = ((image.getHeight()/2) - (BlendImage.getHeight()/2)); g2d.drawImage(BlendImage, Xx, Yy, null); g2d.dispose(); take.setIcon(new ImageIcon(image)); } } /** * @param args the command line arguments */ public static void main(String args[]) { /* Set the Nimbus look and feel */ // /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html */ try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(GeometriApp.class.getName()).log(java.util .logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(GeometriApp.class.getName()).log(java.util .logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(GeometriApp.class.getName()).log(java.util .logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(GeometriApp.class.getName()).log(java.util .logging.Level.SEVERE, null, ex); } // /* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new GeometriApp().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JButton BirghtnessMinus; private javax.swing.JButton Blend; private javax.swing.JButton BrightnessPlus; private javax.swing.JButton ClearEffect; private javax.swing.JButton ContrasPlus; private javax.swing.JButton ContrastMunus; private javax.swing.JButton Edge; private javax.swing.JButton Grayb; private javax.swing.JButton HorizontalFlip; private javax.swing.JButton Invers; private javax.swing.JButton LeftRotate; private javax.swing.JButton RightRotate; private javax.swing.JButton Sharp; private javax.swing.JButton SunEffect; private javax.swing.JButton Threshold; private javax.swing.JButton VerticalFlip; private javax.swing.JButton ZoomIn; private javax.swing.JButton ZoomOut; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JMenu jMenu1; private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem jMenuItem1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JLabel take; // End of variables declaration }