Selasa, 10 Agustus 2010

Java Untuk Pemula

Java Untuk Pemula

Posting sekarang kita tidak akan membahas tentang pemrograman web tapi pemrograman desktop menggunakan bahasa pemrograman Java. Sedikit bercerita, kemarin ada tugas Algoritma Pemrograman menggunakan C++, tapi berhubung installer compiler C++ nya terserang virus, terpaksa deh menggunakan Java. Toh output/hasil yang dikeluarkan (lewat console) gak beda jauh antara Java dengan C++. Dan ternyata membuat program di Java menggunakan console sangatlah gampang dan cepat!. Nah, Jika kamu masih awam tentang Java dan ingin belajar Java, akan kuberikan step-step nya untuk melengkapi komputermu dengan "peralatan" standard untuk belajar pemrograman Java.

Apa saja yang dibutuhkan untuk melakukan pemrograman Java di Windows? Pada dasarnya hanya ada satu saja yaitu JDK (Java Development Kits) yang bisa kamu unduh disini. JDK ini yang akan mengkompilasi source yang kamu buat menjadi file yang bisa dibaca oleh Java Runtime. Setelah selesai diunduh, lalu install di komputermu. Cara menginstallnya juga tidak ribet, tinggal klik Next, dan Finish :). Berikutnya kamu butuh text editor untuk menuliskan source Java yang kamu buat. Pakai Notepad bawaan dari Windows juga bisa tapi text editor favoritku adalah Notepad++ yang bisa kamu unduh disini. Setelah JDK diinstal dan kamu punya text editor, pastikan kamu bisa mengakses Command Prompt-nya Windows. Cara menampilkannya: Klik Tombol Start, lalu pilih menu Run atau tekan tombol bendera di keyboard + R, ketik cmd lalu tekan enter. Jika kamu belum tahu bentuk Command Prompt itu seperti apa, ini gambarnya:

command prompt

Setelah muncul jendela Command Prompt, coba ketikkan disitu perintah berikut: javac , jika muncul pesan "javac is not recognized as an internal or external"..dst, berarti kamu harus memasukkan Path JDK ke Environment Variables. Caranya:

Untuk Windows XP:
Buka Control Panel, jika mode viewnya menggunakan Category, ubah ke Classic dulu biar lebih mudah. Setelah itu, diantara deretan icon yang ada, buka bagian System.
Untuk Windows Vista dan 7:
Buka Control Panel, pilih System dan kemudian disebelah kiri ada menu Advanced System Setting, klik menu itu.

Langkah berikutnya sama untuk XP, Vista atau 7: Akan muncul sebuh jendela baru System Properties. Klik tab Advanced, lalu dibagian bawah ada tombol Environment Variables. Klik tombol itu lalu muncul jendela baru lagi. Lihat dibagian kelompok System Variables, lalu cari bagian Path, dobel klik teks tersebut atau klik lalu tekan tombol Edit dibagian bawahnya. Tambahkan path JDK dibagian Variable Value dengan cara: Teks yang sudah ada jangan dihapus, tapi bagian paling akhir dari teks yang sudah ada diberi tanda titik koma ";" dan diikuti path JDK-nya yang umumnya ada di C:\Program Files\Java\jdk1.6.0_06\bin. Jika bingung, ini contoh gambarnya:

edit nilai environment

Tentu saja pathnya akan berubah seandainya kamu menginstall JDK di lokasi atau drive lain atau kamu menggunakan versi JDK yang berbeda. Jadi pastikan bahwa kamu benar-benar tahu letak direktori bin JDK, gunakan Windows Explorer, copy Adrress bila perlu. Setelah itu klik OK beberapa kali lalu buka ulang Command Prompt (jendela yang lama ditutup terus buka lagi yang baru). Coba ketikkan perintah javac dan jika masih muncul pesan kesalahan yang sama dengan diatas, berarti kamu butuh merestart komputermu. Tapi jika semua langkah diatas udah diikuti dengan benar, kamu bakal melihat seperti ini saat mengetikkan perintah javac:

tampilan perintah javac

Pemrograman Java

Sekarang kita masuk ke pemrograman Java-nya. Kita akan membuat program haloDunia yang cuma menampilkan teks "Halo Dunia!" di console. Pergunakan teks editor kesayanganmu lalu ketik teks berikut ini:

public class haloDunia {

    public static void main(String[] args) {
        //tulis kodemu dalam blok ini
        System.out.print("Halo Dunia!");
        
    }
    
}

Setelah itu simpan file tersebut dengan nama haloDunia.java dan letakkan dimana saja terserah. Yang harus diperhatikan adalah nama filenya harus sama dengan nama class yang dideklarasikan public didalamnya. Pada contoh diatas karena class haloDunia dideklarasikan public maka nama file yang kita buat harus sama yaitu haloDunia lalu diberi extension java. Buka Command Prompt lagi seandainya sudah kamu tutup.

Perintah Pindah Direktori Aktif di Command Prompt

Bagian ini hanya untuk yang awam Command Prompt saja, yang udah paham lewati saja. Dalam Command Prompt, untuk berpindah direktori aktif menggunakan perintah cd, sedangkan untuk berpindah drive aktif (dari C ke D misalnya) maka tinggal ketikkan drivenya diikuti tanda titik dua ":"

pindah direktori

Baris pertama gambar diatas melakukan perintah pindah drive dari D ke E. Baris kedua masuk ke direktori Java yang ada di drive E. Baris ketiga naik satu direktori diatas direktori Java berarti di drive E. Ya.. kira-kira cukup segitulah perintah dasar untuk berpindah direktori aktif lewat Command Prompt.

Mengcompile file Java

Kembali ke file yang telah dibuat tadi, setelah Command Prompt terbuka dan direktori aktif di command prompt berada dimana file tersebut (saya meletakkan file java tadi di drive E:\Java), ketikkan perintah javac diikuti namafile tadi yaitu haloDunia.java. Gambarnya seperti ini:

perintah javac

Jika tidak muncul pesan kesalahan, maka file yang kita buat telah sukses dikompilasi. Sebuah file class dibuat disebelah file java, dan cara mengeksekusinya adalah dengan menggunakan perintah java diikuti nama class-nya. Jika tadi kita menggunakan nama class haloDunia maka yang kita ketikkan adalah "java haloDunia" dan tekan Enter. Lalu muncullah pesan Halo Dunia! yang kita buat menggunakan Java.

hasil program

Penjelasan Program

Kita kembali ke source Java yang telah kita buat diatas.

1   public class haloDunia {
2
3       public static void main(String[] args) {
4           //tulis kodemu dalam blok ini
5           System.out.print("Halo Dunia!");
6           
7       }
8       
9   }

Bagian yang selalu harus ada dan harus selalu diingat adalah deklarasi class (baris 1) dan deklarasi fungsi/method main (baris 3). Kode yang kita buat akan berada di dalam blok fungsi main tersebut. Untuk menampilkan teks di Console menggunakan Java digunakan perintah System.out.print (yang memang kelihatan lebih panjang dari perintah di C++). Karena Java merupakan bahasa pemrograman yang berbasis object maka kita "dipaksa" untuk menggunakan konsep class untuk memunculkan teks di Console. Untuk mengakses properti atau method yang dimiliki suatu object di Java digunakan tanda titik ".". Seperti contoh diatas, untuk mengakses method print digunakan perintah System.out.print().

Kita tidak akan dibahas secara lengkap tentang dasar-dasar dari pemrograman Java, tapi hanya sekilas saja. Jika kamu pernah mempelajari bahasa keluarga C, maka bentuk umumnya hampir sama. Untuk tipe data --hampir sama dengan yang lain-- Java memiliki beberapa tipe data primitif seperti byte, short, int, long, float, double, boolean, char serta tipe data bentukan seperti String dan Number ataupun Array. Untuk mendeklarasikan sebuah variabel adalah dengan cara: tipeData namaVariabel = nilai; sedangkan untuk mendeklarasikan method/fungsi adalah dengan cara: tipeData/Void namaFungsi();. Penamaan variabel di Java adalah case sensitif dan variabel juga dapat menampung sebuah acuan object dari perintah new.

Berikutnya akan kuberikan sebuah source Java singkat yang menggunakan algoritma sederhana untuk menjumlahkan inputan dari user dan menampilkan hasilnya. Disini aku anggap kamu sudah sedikit paham tentang dasar-dasar bahasa pemrograman (apapun bahasanya) karena meskipun judulnya untuk pemula tapi bukan untuk pemula yang benar-benar baru belajar bahasa pemrograman :). Maaf ya...

1   import java.io.Console;
2
3   public class gampang {
4
5       public static void main(String[] args) {
6           //membuat object console
7           Console console = System.console(); 
8           //deklarasi variabel input
9           int input1, input2;
10          //memasukkan nilai input1
11          console.printf("Masukkan input1: ");
12          input1 = Integer.parseInt(console.readLine()); 
13          //memasukkan nilai input2
14          console.printf("Masukkan input2: ");
15          input2 = Integer.parseInt(console.readLine()); //input2
16          //tampilkan hasil
17          console.printf("Hasil Penjumlahan: %d", input1+input2);
18      }
19
20  }

Pada baris pertama kita masukkan library yang mirip fungsi perintah include di C++. Karena kita membutuhkan class Console untuk menerima input dari user maka kita memasukkannya dengan perintah import java.io.Console;. Lanjut ke baris 7, kita membuat sebuah variabel baru dengan tipe data Console. Dibaris 12 dan 15 adalah inputan dari user menggunakan method readLine(). Method readLine() akan mereturn tipe data String, sedangkan yang kita butuhkan adalah tipe data integer. Oleh karena itu kita gunakan method parseInt di class Integer untuk mengubah tipe data String ke Integer. Baris ke 12 adalah menampilkan hasil menggunakan method printf yang fungsinya sama dengan fungsi printf di C++ yaitu untuk mencetak string terformat ke Console. Dan inilah programnya ketika dijalankan:

hasil program

Pengenalan Dasar Class dan Object di Java

Java termasuk OOP (Object Oriented Programming), jadi maka mau tidak mau kamu harus tau konsep dasar tentang Class dan Object di Java. Class adalah kerangka bentuk dari Object. Jadi sebelum dapat membuat object, kamu harus mendefinisikan class-nya terlebih dahulu. Sedangkan object dapat dianalogikan sebagai objek real disekitar kita seperti kambing, kerbau, dsb. Kambing memiliki bentuk dan perilaku. Bentuk yang pendek, berkaki empat, berekor, disebut sebagai properties/fields dan perilakunya yang mengembek, berlari, melompat disebut sebagai methods. Untuk membuat object dari class yang telah kita buat adalah dengan menggunakan perintah new diikuti nama classnya. Berikut ini adalah cara mendefinisikan class dan pembuatan object dalam Java.

public class buatObject {
    /** Mendefinisikan class kambing yang digunakan dalam method main */
    static class kambing {
        //properti nama dengan tipe data String
        public String nama = "Awe";
        
        //method void mengembek
        public void mengembek() { 
            System.out.printf("Embeekkkk !!");
        }
    }
    
    public static void main(String[] args) {
        /** Membuat object kambing dengan nama awe :D */
        kambing awe = new kambing();
        
        System.out.printf("\n\n%s: \"", awe.nama); //menggunakan property nama
        awe.mengembek(); //memanggil method mengembek
    }
}

Di dalam bahasa pemrograman Java, kita diperbolehkan membuat sebuah class di dalam class seperti pada contoh diatas. Dalam class kambing kita membuat properti nama dengan tipe data String serta sebuah method mengembek yang bertugas menampilkan teks Embeekkkk !! :) di Console. Keliatan kan beda antara method dan property? (method adalah suatu fungsi sedangkan properti adalah sebuah variabel). Properti serta Method diatas dibuat public agar bisa diakses dari luar class tersebut. Salah satu konsep dalam OOP adalah Encapsulation dimana kamu bisa menyembunyikan method dan properti tertentu agar tidak dapat diakses dari luar class yang bersangkutan. Tujuannya bukan pelit atau mempersulit :) tapi justru mempermudah kamu dan orang lain untuk tidak mengotak-otak bagian yang tidak seharusnya diotak-atik atau diubah.

Kamu bisa mendeklarasikan suatu method atau properti menjadi public, protected atau private. Jika menggunakan visibility private, maka suatu method atau properti hanya bisa diakses di dalam class tersebut saja. Sedangkan dengan protected maka method atau properti tidak bisa diakses dari luar class tapi masih bisa diakses oleh turunan dari class itu. Konsep warisan class akan dibahas setelah ini. Nah, program diatas jika dieksekusi akan menghasilkan output seperti berikut:

hasil program

Class Warisan (Inherits) dan Constructor

Penggunaan class akan sangat bermanfaat karena lebih modular, bisa terus dikembangkan dan dapat digunakan berulang kali (reuseable). Untuk mengembangkan class yang sudah ada, kita dapat memanfaatkan fasilitas class warisan (padahal tidak ada yang meninggal) menggunakan kata kunci extends. Semua method dan properti induknya yang menggunakan tanda protected dan public bisa digunakan atau didefinisikan ulang di class warisan. Misalkan sebelum membuat class kambing kita buat class hewan dulu dengan method dan properti yang akan diwariskan ke hewan lain seperti kucing, ayam, dsb. Selain itu, sebuah class dapat merupakan turunan lebih dari satu class. Misalkan class awe merupakan turunan dari class hewan dan turunan class manusia yang jika dituliskan menjadi class awe extends manusia extens hewan { --- awe, maafkan aku jika terlalu berlebihan :). Berikut ini akan aku beri contoh penggunaan class warisan di Java.

public class cobaObject {
    
    //turunan dari class hewan (ada dibagian bawah)
    static class kambing extends hewan {
        public void bersuara() { mengembek(); }
        private void mengembek() { System.out.printf("Embeekkkkk....!"); }
    }
    static class ayam extends hewan {
        public void bersuara() { berkokok(); }
        private void berkokok() { System.out.printf("Kukuuruyuuuk...!"); }
    }
    
    public static void main(String[] args) {
        kambing awe = new kambing();
        awe.nama = "Kambing"; awe.kaki = 4;
        System.out.printf("%s (%s berkaki %d) bersuara: ", "Awe", awe.nama, awe.kaki); 
        awe.bersuara(); System.out.printf("\n\n");
        
        ayam dofir = new ayam();
        dofir.nama = "Ayam"; dofir.kaki = 2;
        System.out.printf("%s (%s berkaki %d) bersuara: ", "Dofir", dofir.nama, dofir.kaki); 
        dofir.bersuara(); System.out.printf("\n\n");
    }
}

class hewan {
    public String nama = "Hewan";
    protected int kaki = 0;
    public void bersuara() { 
        //suara hewan..
    }
}

Kamu perhatikan di class kambing dan ayam ada override method bersuara() dari class induknya. Class warisan dapat saja mendefinisikan ulang suatu method yang berbeda dari apa yang dilakukan oleh induknya. Perubahan atas method induknya ini disebut dengan Override. Program diatas jika dieksekusi akan menghasilkan output seperti berikut:

hasil program

Ada kalanya saat membuat object baru, kita ingin agar ada hal dasar tertentu yang langsung dikerjakan oleh object tersebut. Nah, "method" yang dipanggil pertamakali saat sebuah object terbentuk disebut dengan Constructor. Ciri dari constructor adalah dia memiliki nama yang sama dengan nama class-nya serta tidak me-return apapun. Contoh, berdasarkan program sebelumnya (dengan banyak perubahan), kita ingin class hewan memiliki sebuah constructor yang memanggil method bernafas() pada class ini.

public class cobaObject {
    public static void main(String[] args) {
        kambing awe = new kambing(); awe.bersuara("Awe");
        ayam dofir = new ayam(); dofir.bersuara("Dofir");
    }
}

class hewan {
    private static String nama = "Hewan";
    protected int kaki = 0;
    public boolean hidup; //status kehidupan
    
    //constructor class hewan
    public hewan() { 
        if(bernafas()) { hidup = true; } else { hidup = false; } //apakah bernafas?
    }
    protected boolean bernafas() { 
        return true; 
    }
    public void bersuara() { 
        //suara hewan..
    }
    //static method untuk mengakses private static property nama
    public static String lihatNama() { return nama; }
}

//class ayam turunan hewan
class ayam extends hewan {
    private static String nama = "Ayam"; 
    public int kaki = 2;
    
    //override method bernafas menjadi return false, akibatnya hidup = false
    @Override
    protected boolean bernafas() { return false; }
    
    public void bersuara(String nama) { 
        if(hidup) {
            System.out.printf("%s (%s berkaki %d) bersuara: ", nama, lihatNama(), kaki);
            berkokok();
        } else {
            System.out.printf("%s (%s berkaki %d) tak bersuara karena telah mati :(", nama, lihatNama(), kaki);
        }
        System.out.printf("\n");
    }
    private void berkokok() { System.out.printf("Kukuuruyuuuk...!"); }
}

//class kambing juga turunan hewan
class kambing extends hewan {
    private static String nama = "Kambing";
    
    //contoh constructor di class warisan
    public kambing() { 
        hidup = false; kaki = 4;
    }
    
    public void bersuara(String nama) { 
        if(hidup) {
            System.out.printf("%s (%s berkaki %d) bersuara: ", nama, lihatNama(), kaki);
            mengembek();
        } else {
            System.out.printf("%s (%s berkaki %d) tak bersuara karena telah mati :(", nama, lihatNama(), kaki);
        }
        System.out.printf("\n");
    }
    private void mengembek() { System.out.printf("Embeekkkkk....!"); }
}

Jika class warisan tidak memiliki constructor seperti pada class ayam pada contoh diatas, maka Java akan mencari constructor di class induknya. Mungkin kamu bertanya, apakah semua class harus memiliki constructor? Jawabannya adalah tidak, selama tidak ada hal khusus yang harus dilakukan saat sebuah object dibuat dari class tersebut maka sebuah class tidak harus memiliki constructor. Selain itu pada class yang tidak memiliki constructor, Java akan membuatkan constructor default tanpa argumen secara otomatis. Kamu juga bisa membuat lebih dari satu constructor dalam satu class untuk parameter yang berbeda-beda. Program diatas setelah dieksekusi akan menghasilkan karya seperti berikut:

hasil program

Kata kunci "Static"

Dari tadi kita selalu menggunakan kata kunci Static, tapi apa sih sebenarnya maksud penggunaan kata ini?. Pada dasarnya, jika sebuah method atau properti dideklarasikan sebagai static maka dia dapat langsung diakses dari luar class tanpa harus membuat objectnya dengan perintah new. Kita langsung dapat memanggil method atau properti itu dengan didahului nama classnya, misalkan: hewan.nama tanpa harus membuat object dengan cara new hewan() misalnya. Yang perlu kamu catat adalah pemanggilan class, method dan properti yang tidak static dari dalam method yang static akan memunculkan error karena method atau properti dinamis harus dibuat dulu dengan perintah new sedangkan method atau properti static tidak.

Properti yang dinyatakan static biasa disebut sebagai Class Variable karena menjadi variabel dari class dan bukan variabel dari object/instance. Misalkan kita membuat 3 object dengan nama yang berbeda dari class kambing, apapun nama object yang dibuat mereka tetap memiliki properti yang sama yang dimiliki oleh class kambing yaitu nama yaitu "Kambing". Sedangkan Method yang dinyatakan static biasa disebut sebagai Class Method yang biasanya digunakan untuk mengakses static properti.

Simpulan Umum Dalam Pembuatan Class dan Object

Berikut ini adalah kesimpulan singkat dalam pembuatan class dan object di Java:

  • Dalam pendeklarasian class, nama class dapat saja didahului oleh modifier. Di bagian dalam class berisi property, method dan mungkin sebuah constructor dari class tersebut. Constructor yang dimulai saat sebuah object terbentuk menggunakan nama yang sama dengan nama class dan tidak memiliki return value. Kamu bisa mengatur hak akses atas class dan anggotanya menggunakan cara yang sama yaitu menggunakan modifier seperti public, protected dan private di dalam pendeklarasiannya.
  • Untuk membuat object dari sebuah class adalah dengan menggunakan perintah new. Operator new akan mereturn sebuah acuan pada object yang telah dibuat. Kamu dapat menempatkan acuan tersebut pada sebuah variabel atau dapat juga langsung menggunakannya. Untuk mengakses property dan method yang dapat diakses dari luar class adalah dengan menggunakan: acuanObject.namaProperty (untuk properti) dan acuanObject.namaMethod() (untuk method).

NetBeans

Sebagai penutup, jika kamu ingin membuat aplikasi Java yang lebih kompleks pada beragam platform lengkap dengan GUI-nya, sebaiknya kamu menggunakan NetBeans. Apa itu NetBeans? NetBeans adalah IDE (Integrated Development Environment -- benar gak sih? :) --) yang gratis dan bagus. Kamu bisa mempelajari NetBeans dan mengunduhnya disini. Selamat belajar dan mencoba-coba pemrograman Java! Sukses selalu buatmu.

Ucapan Terima Kasih

Aku sangat berterimakasih pada Awe dan Dofir yang tidak berkeberatan namanya digunakan sebagai contoh dipostingan kali ini :)...

Catatan Dari Penulis

Sekedar menginformasikan, aku sudah membuat sebuah aplikasi Java (dengan tipe file .jar) yang bisa langsung dieksekusi (dobel klik) untuk memunculkan Command Prompt yang direktori aktifnya sudah menunjukkan dimana file jar tersebut diletakkan. Ini lebih cepat daripada harus mengetik perintah cd berulangkali di Command Prompt untuk berpindah direktori aktif. Cukup letakkan file jar di sembarang direktori, lalu jalankan, maka muncul Command Prompt dengan direktori aktif di direktori tersebut. Kamu bisa unduh disini.

Sabtu, 03 April 2010

Resize Image/Gambar dengan PHP

Resize Image/Gambar dengan PHP

Melakukan resize gambar sangatlah simple, apalagi menggunakan software image editing seperti ®Photoshop, tinggal beberapa klik udah jadi. Tapi bagaimana jika file gambar yang akan diedit ada diserver atau bayangkan contoh kasus seorang user mengupload gambar sedangkan anda ingin agar gambarnya tidak lebih lebar dari 100 pixel?.

Nah!, disini akan dibahas cara melakukan resize gambar langsung menggunakan PHP sehingga anda tidak perlu membuka aplikasi image editor lagi. Jika anda tidak ingin tahu hal teknisnya dan langsung ingin mencoba menggunakannya, anda dapat unduh filenya disini. Didalamnya sudah ada "sedikit" keterangan tentang cara menggunakannya. Sebenarnya sudah ada banyak software yang dibuat dengan PHP untuk beroperasi pada file gambar, dan saya tidak ingin mereinventing the wheel, tapi kalau hanya membutuhkan kemampuan untuk melakukan resize saja, kenapa harus menggunakan software yang lengkap.

Source Code

Ini dia source PHP yang digunakan, nanti akan kita bahas setelahnya.

<?php
class my_image {
    protected $image;
    
    public function __construct($image) {
        if(!is_file($image)): trigger_error('Image file does not exists', E_USER_ERROR); 
        else: $this->image = $image; endif; clearstatcache();
    }
    
    public function resize($new_width=0, $new_height=0, $new_name='') {
        if(empty($new_width) && empty($new_height)) { return false; }
        
        list($iwidth, $iheight, $type) = getimagesize($this->image);
        $rext = image_type_to_extension($type, false);
        
        if($type !== 2 && $type !== 3) { return false; }
        
        if(!empty($new_width) && empty($new_height)) {
            $mwidth = $new_width / $iwidth;
            $new_height = round($iheight * $mwidth);
        }
        
        if(empty($new_width) && !empty($new_height)) {
            $mheight = $new_height / $iheight;
            $new_width = round($iwidth * $mheight);
        }
        
        $image_p = imagecreatetruecolor($new_width, $new_height);
        $image = ($rext == 'png' ? imagecreatefrompng($this->image) : imagecreatefromjpeg($this->image));
        
        if(isset($image)) {
            imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $iwidth, $iheight);
        }
        
        if(!empty($new_name)) {
            $next = strtolower(end(explode('.', $new_name)));
            switch($next) {
                case 'jpg':
                    if($rext == 'png'): $new_name .= '.'.$rext; endif; break;
                case 'png':
                    if($rext == 'jpeg'): $new_name .= '.'.$rext; endif; break;
                default:
                    $new_name .= '.'.$rext;
            }
        } else { $new_name = $this->image; }
        
        if($rext === 'png') {
            imagepng($image_p, $new_name, 0);
        } else {
            imagejpeg($image_p, $new_name, 95);
        }
    }
}
?>

Pembahasan

Pada kode diatas, saya membuat sebuah class dengan nama my_image yang memiliki constructor yang meminta input file gambar yang akan diresize. Contoh pembuatan objek dari class ini adalah: $img = new my_image('path/imageku.jpg');. Object constructor akan mengecek apakah nama file yang anda masukkan benar sebuah file, jika file tidak ketemu akan muncul pesan error kalau file tidak ada. Jika file ditemukan, constructor akan mengeset properti image di class ini. Setelah objek dibuat, anda langsung dapat menggunakan fungsi resize dengan cara: $img->resize(10, 10, 'imut.jpg'); yang menghasilkan image baru dengan nama imut.jpg.

Method resize menggunakan tiga parameter yang semuanya bersifat optional yaitu:

  1. $new_width: Angka lebar gambar yang baru dalam pixel.
  2. $new_height: Angka tinggi gambar yang baru juga dalam pixel.
  3. $new_name: Nama file yang baru hasil dari resize.

Kita bahas kode berikutnya dalam fungsi resize()

if(empty($new_width) && empty($new_height)) { return false; }
   
list($iwidth, $iheight, $type) = getimagesize($this->image);
$rext = image_type_to_extension($type, false);
if($type !== 2 && $type !== 3) { return false; }

Kode diatas akan mengecek apakah parameter lebar dan tinggi diisi atau tidak. Jika keduanya tidak diisi maka fungsi akan mereturn FALSE. Setelah itu kita gunakan fungsi dari PHP getimagesize() yang akan menghasilkan array informasi dari file gambar yang akan kita resize (yang diset melalui constructor). Secara berurutan informasi itu adalah: lebar, tinggi, jenis gambar, string properti yang digunakan di HTML, dan terakhir adalah mime type yang dikirim oleh server untuk file gambar tersebut.

Jenis gambar berisi angka sedangkan saya butuh string ekstensionnya, karena itu saya gunakan fungsi image_type_to_extension() (PHP 5+) dengan parameter kedua diisi FALSE agar string yang dihasilkan tidak didahului karakter dot/titik. Baris berikutnya, karena fungsi resize hanya mendukung jenis gambar JPEG/JPG dan PNG saja, maka fungsi akan mereturn FALSE jika jenis gambarnya selain keduanya.

if(!empty($new_width) && empty($new_height)) {
    $mwidth = $new_width / $iwidth;
    $new_height = round($iheight * $mwidth);
}
        
if(empty($new_width) && !empty($new_height)) {
    $mheight = $new_height / $iheight;
    $new_width = round($iwidth * $mheight);
}
        
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = ($rext == 'png' ? imagecreatefrompng($this->image) : imagecreatefromjpeg($this->image));
        
if(isset($image)) {
    imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $iwidth, $iheight);
}

Beberapa baris awal pada kode diatas akan menghitung kira-kira lebar dan tinggi dari gambar yang baru. Jika lebar diset sedangkan tinggi tidak diset maka fungsi akan menghitung tinggi baru berdasarkan perbandingan lebar gambar asli dengan lebar gambar yang baru, begitu pula sebaliknya. Selanjutnya kita membuat resource gambar menggunakan fungsi imagecreatetruecolor() yang berisi parameter lebar dan tinggi gambar yang kita inginkan.

Karena kita mendukung dua jenis gambar maka kita menggunakan dua fungsi yaitu: imagecreatefrompng() dan imagecreatefromjpeg yang ditentukan berdasarkan isi variabel $rext. Kedua fungsi tadi berfungsi membuat gambar yang berasal dari sebuah URL ataupun nama sebuah file.

Setelah itu kita menggunakan fungsi imagecopyresampled() yang memiliki fungsi hampir sama dengan imagecopyresized() tapi dengan kualitas yang lebih baik. Fungsi imagecopyresampled memiliki 10 parameter yaitu:

  1. Resource gambar file tujuan.
  2. Resource gambar file asal.
  3. Titik koordinat x file tujuan.
  4. Titik koordinat y file tujuan.
  5. Titik koordinat x file asal.
  6. Titik koordinat y file asal.
  7. Lebar file gambar tujuan.
  8. Tinggi file gambar tujuan.
  9. Lebar file gambar asal.
  10. Tinggi file gambar asal.

Dari parameter-parameter diatas kita bisa membayangkan bahwa kita akan dapat melakukan "crop" pada suatu gambar, tapi saat ini tidak akan dibahas.

if(!empty($new_name)) {
    $next = strtolower(end(explode('.', $new_name)));
    switch($next) {
        case 'jpg':
            if($rext == 'png'): $new_name .= '.'.$rext; endif; break;
        case 'png':
            if($rext == 'jpeg'): $new_name .= '.'.$rext; endif; break;
        default:
            $new_name .= '.'.$rext;
    }
} else { $new_name = $this->image; }
        
if($rext === 'png') {
    imagepng($image_p, $new_name, 0);
} else {
    imagejpeg($image_p, $new_name, 95);
}

Hampir selesai :). Baris berikutnya adalah memeriksa apakah nama baru diset atau tidak. Jika iya, akan dicek apakah memiliki ekstension yang sama dengan target. Jika berbeda akan ditambahkan ekstension secara otomatis. Jika nama baru tidak diset maka fungsi akan melakukan overwrite pada file gambar yang lama. Setelah nama selesai dicek selanjutnya kita gunakan dua fungsi untuk menyimpan file gambar JPEG/JPG dan PNG dari resource yang telah kita buat yaitu dengan fungsi imagepng dan imagejpeg. Angka 0 dan 95 adalah kualitas dari gambar yang dihasilkan. Untuk PNG menggunakan range 1-10 sedangkan JPEG menggunakan range 1-100 (defaultnya 75). Kualitas gambar juga akan mempengaruhi ukuran dari gambar yang akan kita buat.

Penggunaan Class

Cara menggunakan class diatas adalah pertama anda harus membuat instance lebih dahulu dengan perintah new yang berisi string path ke file gambar yang akan diedit. Contoh:

$gambar = 'path/image.jpg';
$img = new my_image($gambar);


Selanjutnya tinggal panggil resize method dengan cara berikut:

$lebar_baru = 10;
$tinggi_baru = 10;
$nama_gambar_baru = 'path/imagekecil.jpg';
$img->resize($lebar_baru, $tinggi_baru, $nama_gambar_baru);


Selesai. Jika anda ingin mengunduh file yang saya buat, anda dapat melakukannya disini. Thanks. Oh iya, tambahkan handle resize untuk jenis file GIF jika anda berkenan :).

Rabu, 31 Maret 2010

Line Break

Ini adalah posting pertama di blog yang gak penting ini. Karena gak penting, maka aku akan membahas hal yang juga gak penting yaitu tentang Line Break. Line break (baca: lain brek :) adalah perintah untuk pindah baris (dengan menekan tombol Enter) saat kita mengetikkan teks di text editor sederhana seperti Notepad. Tanpa anda sadari, sebenarnya text editor memasukkan karakter tak terlihat pada file anda. Ada dua karakter tersembunyi yang digunakan dalam perintah line break yaitu:
  • \r atau CR (Carriage Return) yang bernilai 10 pada ASCII
  • \n atau LF (Line Feed) yang bernilai 13 pada ASCII
Kalau anda bingung seperti apa kira-kira bentuknya, anda bisa lihat gambar ini:

Tiap-tiap sistem operasi mempunyai bentuk yang berbeda-beda dalam membuat perintah line break ini, namun secara umum ada tiga pola yaitu:
  • Unix, Linux, dsb hanya menggunakan "\n" atau LF untuk perintah pindah baris.
  • Mac hanya menggunakan "\r" atau CR untuk perintah pindah barisnya.
  • Windows menggunakan keduanya, yaitu "\r\n" atau CRLF untuk berpindah baris.
Akibatnya, akan ada beberapa permasalahan saat text diketik di OS yang berbeda karena teks akan nampak "lucu". Berikut ini adalah contoh teks yang diketik di Linux tapi dilihat menggunakan Notepad di Windows.

Selain nampak lucu, mungkin juga akan ada akibat yang fatal dari adanya perbedaan ini. Misalnya, teks yang ditulis di Mac tidak akan dapat dibaca dengan baik oleh text editor di Linux karena "tidak ada" perintah pindah barisnya. Sedangkan teks yang ditulis di Windows kemungkinan besar masih bisa dibaca oleh Linux. Dalam pemrograman yang berhubungan dengan teks, anda tidak akan pernah lepas dari penggunaan karakter-karakter ini seperti membuang perintah pindah baris, split baris perbaris, dsb. Jika dalam Regular Expression, biasanya karakter-karakter ini berbentuk: [\n] dan [\r]. Selain kedua karakter khusus diatas, ada satu lagi karakter lain yaitu "\t" yang bernilai 9 pada ASCII untuk penekanan tombol TAB. Jika anda ingin berpusing ria dengan line break, anda bisa lihat di Wikipedia. That's all... :)