Analisa Program Pengolahan Citra Digital - Operasi Titik

Running program



Gambar 1 default


Gambar 2 operasi grayscale


Gambar 3 operasi biner

Running Console


Hasil pemberitahun di konsole netbean bahwa proses berhasil dijalankan.

Source Code

Layout Program

Pertama kali yang harus dilakukan adalah membuat layout program seperti ini dengan javax swing, dengan dua menubar diatas dan tiga menu item disetiap menu barnya. Menubar File berisi -> Buka, Simpan, dan Keluar. Sedangkan menubar Edit berisi -> Grayscale, Biner, dan Default.
  • Buka => berfungsi untuk membuka file explorer dan memilih gambar mana yang akan diproses.
  • Simpan => digunakan untuk menyimpan file hasil operasi dalam computer.
  • Keluar => menutup program.
  • Grayscale => mengubah warna citra menjadi terbagi ke beberapa tingkat keabuan.
  • Biner => mengubah warna citra menjadi dwiwarna (hitam dan putih).
  • Default => mengubah gambar dalam format RGB (red, green, blue).
Ditengah layout program terdapat label yang nantinya gambar akan dikonvert menjadi icon di layput tersebut.

Struktur Program


Berikut struktur programnya. Dapat kita lihat terdapat 2 class pokok, yaitu classGambar.java dan Gambar.java. ClassGambar sebagai inti operasi program sedangkan Gambar sebagai pemanggil javax swing untuk GUI-nya. Saya tidak menjelaskan beberapa variable dan objek pada Gambar.java karena sebagian adalah bawaan dari Swing, tidak boleh dirubah. Pada class Gambar saya menambah class SliderListener yang mengimplementasikan class abstrak ChangeListener. Fungsinya akan saya jelaskan pada pembahasan Brightness dibawah. Lalu untuk class-class yang diimport (Image, BufferedImage, IO, dll) tidak saya masukkan ke diagram, class tersebut cukup saya jelaskan di pembahasan dibawah juga.

Penjelasan Coding

Attribute ClassGambar


File program dipisah menjadi 2, Gambar.java sebagai gui-nya dan ClassGambar.java sebagai sumber inti programnya. Pada ClassGambar berisi beberapa atribut, semua berupa variable global.
  • public ImageIcon SourceIcon: mendeklarasikan objek SourceIcon yang berasal dari class ImageIcon. ImageIcon adalah class yang mengimplementasikan interface icon yang berfungsi membuat icon dari gambar. Sedangkan SourceIcon digunakan untuk menyimpan sumber icon.
  • public Image SourceImage: mendeklarasikan objek SourceImage yang berasal dari class ImageIcon. Image adalah class abstrak perpanjangan dari class object pada java. Class image adalah superclass dari semua class yang merepresentasikan gambar grafik. Lalu SourceImage berfungsi untuk menyimpan sumber gambar.
  • public ImageIcon ScaleIcon: mendeklarasikan objek ScaleIcon yang berasal dari class ImageIcon. Objek ScaleIcon digunakan untuk menyimpan icon yang berasal dari ScaledImage.
  • public Image ScaledImage: mendeklarasikan objek ScaledImage yang berasal dari class Image. Objek ScaledImage berfungsi untuk meyimpan skala/ ukuran gambar.
  • public Image ResultImage: mendeklarasikan objek ResultImage yang berasal dari class Image. Objek ResultImage akan dipakai untuk menyimpan citra yang berasal dari ResultBuffer.
  • public Image ScaleResultImage: mendeklarasikan objek ScaleResultImage yang berasal dari class Image. Objek ScaleResultImage diperuntukkan menyimpan skala/ ukuran citra yang berasal dari ResultImage yang telah dihitung skalanya dengan method bawaan class Image.
  • public ImageIcon ScaleResultIcon: mendeklarasikan objek ScaleResultIcon yang berasal dari class ImageIcon. Objek ScaleResultIcon akan digunakan untuk menyimpan citra icon dari ScaleResultImage.
  • public String URLImage: mendeklarasikan objek URLImage yang berasal dari class String. URLImage digunakan untuk menyimpan url/ path sumber file citra.
  • public boolean ScaledFlag = false: mendeklarasikan variable boolean ScaledFlag dengan isian false. Variabel ini akan digunakan untuk mengecek ukuran citra yang akan ditampilkan.
  • public BufferedImage SourceBuffer: mendeklarasikan objek SourceImage yang berasal dari class BufferedImage. Class BufferedImage adalah perpanjangan dari class Image. Subclass BufferedImage membuat sebuah citra dengan struktur/ blok-blok dari data citra. BufferImage terdiri dari ColorModel dan Raster. Semua objek dari BufferImage mempunyai kordinat awal yang terletak di kanan atas. Sedangkan sourceBuffer berfungsi untuk tempat dimana citra disimpan setelah dibaca oleh ImageIO.
  • public BufferedImage ResultBuffer: mendeklarasikan objek ResultBuffer yang berasal dari class BufferedImage. ResultBuffer berfungsi untuk menyimpan citra setelah proses setelah dimanipulasi.
  • public long sWidth: mendklarasikan variabel sWidth dengan isian integer (bulat) dengan rentang -2147483647 sampai 2147483647. sWidth digunakan untuk menyimpan lebar citra.
  • public long sHeight: mendeklarasikan varibel sHeight dengan isian integer (bulat) dengan rentang -2147483647 sampai 2147483647. sHeight digunakan untuk menyimpan panjang citra.

Constructor ClassGambar

Setelah itu buat konstruktor pada ClassGambar yang otomatis akan dipanggil ketika menginisialisasikan objek Classgambar. Pada kontruktor ini terdapat 3 parameter, url, width, dan height. ketika kontruktor berjalan, isi pada parameter url akan di masukkan ke objek URLImage. Setelah itu akan melakukan pengecekan berapa lebar (width) dan panjang (height) citra. Jika panjang atau lebar kurang dari <= 0, maka ScaleFlag tetap false. Sedangkan jika lebih dari, maka ScaledFlag true serta memasukkan nilai width dan height ke sWidth dan sHeight.

Method deepCopy


Method ini mengambil banyak peran dalam program. Sebelum citra dimanipulasi, method ini selalu dipanggil terlebih dahulu untuk menganalisa sebuah citra. Ketika method ini dijalankan, ia akan menerima objek BufferedImage sebagai inputnya. Setelah itu mendeklarasi dan mengisi objek cm yang berasal dari class ColorModel dengan memasukkan model warna citra.

Lalu medeklarasikan boolean isAlphaPremultiplied untuk mengecek apakah citra ini memiliki pixel yang ganda atau tidak untuk ditranslasikan ke ColorModel. Selanjutnya mendeklarasikan dan mengisi objek raster dengan citra yang dinputkan tadi dalam raster yang dapat dibaca. Selanjutnya pada akhir program dikirim inisialisasi BufferedImage dari proses diatas.

Method getIcon

GetIcon adalah method perpanjangan dari class ImageIcon. Pertama kali ia akan mengecek URLImage terlebih dahulu, jika kosong akan mengembalikan nilai null. Jika ada isinya SourceIcon akan diinisialisasi ImageIcon dari URL tersebut. Lalu SourceImage diisi dengan citra dari SourceIcon.

Selanjutnya blok kode try akan dijalankan untuk membaca citra dengan. Citra dibaca oleh ImageIO.read lalu dimasukkan dalam SourceBuffer. Jika sumber file tidak ditemukan maka catch akan menangkat error tersebut. Sangat penting menggunakan exception hadling ketika berurusan dengan input-output file.

Kemudian, menampilkan ukuran icon di console serta mengecek ScaledFlag, jika true maka ScaledImage akan diisi skalanya dari SourceImage dan mengisi ScaleIcon dengan ScaledImage. Lalu mengirim nilai ScaleIcon. Jika false, SourceIcon yang dikirim.

Method Grayscale


Method ini akan merubah gambar menjadi hitam putih dengan skala keabuan. Pertama kali yang dijalankan deepCopy akan mengambil Analisa gambar dari SourceBuffer dan dimasukkan ke ResultBuffer. Kamudian diisi berapa tinggi dan panjangnya citra dari ResultBuffer tadi.

Setelah itu deklarasikan x dan y, sebagai titik kordinat dimana kita akan memanipulasi pixel pada citra. Lalu RGB, Red, Green, Blue, Gray untuk menyimpan nilai-nilai itu dari citra. Lalu buatlah objek tWarna.

Saya menggunakan nested loop untuk memanipulasi citra tiap pixel, for pertama untuk baris, kedua untuk kolom. Didalam for RGB akan menyimpan nilai RGB dari ResultBuffer di setiap kordinat pixelnya. Lalu diisilah tWarna dari RGB tadi. tWarna yang sudah mempunyai nilai RGB, akan diambil nilai RGBnya kedalam variable tadi (Red, Green, Blue, Gray).

Lalu tWarna akan diisi kembali dengan isian Gray semua. Langkah selanjutnya ResultBuffer akan diset nilai RGBnya sesuai kordinat tadi dengan warna RBG yang isinya Gray semua yang tadi.

Lalu akhirnya ResultImage dimasukkan nilai ResultBuffer dengan casting Image. ScaleResultImage akan diisi oleh ResultImage dengan mengambil skala citra. Selanjutnya ScaleResultImage dikonvert menjadi icon dan dimasukkan kedalam ScaledResultIcon.

Method Biner


Kode program pada operasi biner hampir sama dengan operasi grayscale. Maka dari itu saya akan menjelaskan perbedaanya saja. Ok. Perbedaan yang mencolok pada algoritma if ditengan nested loop. If itu berfungsi untuk memvalidasi nilai gray, dan dirubah menjadi 0 jika <= 128 dan 255 jika tidak. Nilai Gray tersebut didapatkan dari rata-rata nilai Red, Green, Blue pada citra. Hasil akhirnya citra mempunyai dua macam warna,, hitam dan putih saja.

Method Default


Prose default juga hampir sama dengan grayscale. Saya cukup menjelaskan yang beda saja. Tepat di dalam nested loop, tWarna pada kode ini mengirimkan nilai Red, Green, dan Blue. Maka terbentuklah citra yang berwarna.

Method SaveImage


Menyimpan gambar adalah tugas method ini. Untuk menyimpan gambar ia menggunakan url dan bantuan dari class File. Dalam blok kode try-catch terdapat algoritma untuk menyipan nama file serta validasi dari file yang di tulis. Jika tidak ada .jpeg maka akan ditambah dengan otomatis.

Deklarasi ClassGambar pada Gambar.java


Deklarasikan ClassGambar dengan objek bernama gambar.

Method Klik Buka pada class Gambar


Ketika buka diklik, progam akan memanggil wondows untuk membuka file. Yang mana semua ini di bantu oleh class JFileChooser.

Method klik Simpan pada class Gambar


Kode program ini akan membuka jendela untuk menyimpan file yang sudah dimanipulasi.

Method klik Keluar pada class Gambar


Intinya method ini akan menutup program dengan sempurna. Penjelasannya begini, this merujuk kepada class itu sediri. Yaitu class gambar.java. Class tersebut akan memanggil dispose. Dispose akan melepas semua sumber native screen yang sedang digunakan. Semua sumber dari komponen gambar.java akan dihacurkan/ dihapus dan semua memory yang digunakan akan dikembalikan ke OS.

Method klik Grayscale pada class Gambar


Pada program ini objek gambar akan memanggil method Grayscale. Yang mana merubah citra menjadi hitam putih dengan derajat keabuan. Setelah itu jLabel akan memanggil method setIcon dengan parameternya berupa objek gambar dengan method ScaleResultIcon;

Method klik Biner pada class Gambar


Pada kode program ini, method Biner pada objek gambar akan mengolah citra sesuai kode program yang dijalankan. Setelah itu jLabel akan di-set iconnya dengan method setIcon yang parameternya berupa objek gambar dengan methodnya ScaleResultIcon.

Method klik Default pada class Gambar


Ketika submenu default dipilih, kode ini yang dipanggil. Objek gambar akan memanggil method Default. Setelah itu jLabel akan memanggil icon pada objek gambar, yaitu ScaleResultIcon yang telah berisi icon gambar.

BRIGHTNESS

Running Program

Gambar 4 brightness down


Gambar 5 brightness up

Layout Program


Pada layout ini saya menambakan Javax swing slider dan label di sampingnya. Slider berfungsi untuk merubah nilai brightness gambar dan label hanya untuk menunjukkan nilainya.

Coding

Masukkan class baru



Pada class SliderListener saya mengimplementasikan class abstrak ChangeListener. Karena ini class abstrak maka saya harus mengimplementasikan methodnya pada class SliderListener dengan meng-Override stateChanged dengan parameter ChangeEvent e. Kenapa saya mengunakan ChangeListener? Jawabannya adalah karena saya ingin perubahan brightness pada citra dapat ditampilkan secara real-time/ langsung. Inilah fungsi dari class ChangeListener.

Didalamnya saya mengambil nilai slider, lalu merubahnya menjadi string untuk saya kirimkan nilainya ke label angka disamping slider. Didalamnya saya sisipkan kode untuk merubah brightness citra dan meng-set-nya di jLabel1.

Edit Konstruktor Gambar


Pada kode ini saya menambahkan ChangeListener pada slider dan mengset slider untuk tidak terlihat. Methosnya akan saya jelaskan dibawah.

Mengatur Slider


Fungsi dari kode diatas adalah untuk menampilkan slider jika user menekan brightness.

ActionListener brightness


Pada kode ini gambar akan dirubah brightnessnya sesuai dengan posisi slider lalu mengsetnya pada jLabel1. Oh ya, sebelumnya slider saya tampilkan dulu dengan isSlideruse(true).


Jika kalian ingin download source code-nya silahkan klik link berikut.

Comments

Populer