Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

Mengubah ukuran dan memanipulasi gambar dalam PHP (dengan contoh-contoh)

by
Difficulty:IntermediateLength:MediumLanguages:

Indonesian (Bahasa Indonesia) translation by Imam Firmansyah (you can also view the original English article)

Dalam tutorial saya sebelumnya, kita membahas tentang dasar dari manipulasi gambar menggunakan pustaka PHP GD. Dalam tutorial itu, Saya memberikan pengantar singkat ke pustaka tersebut dan menunjukkan anda bagaimana cara memuat gambar-gambar dari file atau membuat mereka dari awal dalam PHP. Setelah itu, kita belajar bagaimana cara melakukan crop / memotong, rotate / memutar, scale / skala dan flip / membalik gambar menggunakan GD. Saya membahas fungsi imagefilter() untuk menerapkan filter yang berbeda ke sumber gambar yang dimuat dalam skrip. Saya juga menyebutkan beberapa fungsi yang berguna di GD seperti imagesx() dan imagesy() untuk mendapatkan lebar dan tinggi gambar yang dimuat.

Pada akhir tutorial GD terakhir saya, Anda belajar bagaimana menggunakan pustaka untuk mengotomatisasi tugas-tugas dasar seperti mengubah ukuran semua gambar dalam sebuah direktori atau menerapkan filter seperti grayscale pada gambar sebelum menyimpan hasil akhir. Jika sebelumnya anda belum pernah menggunakan pustaka PHP GD, Saya menyarankan anda melalui artikel pengantar pustaka GD sebelum membaca yang satu ini.

Dalam tutorial ini, kita akan belajar tentang banyak fungsi yang lebih berguna dalam pustaka GD dan bagaimana mereka dapat digunakan untuk mengotomatisasi lebih banyak tugas manipulasi gambar kami.

Memanipulasi Gambar Menggunakan Matrik Konvolusi

Kecuali untuk piksel di bagian tepi, setiap piksel dalam sebuah gambar dikelilingi oleh delapan piksel lainnya. Efek seperti blur (buram) atau edge detection (deteksi tepi) dihitung untuk setiap piksel tergantung pada nilai piksel dan nilai piksel sekitarnya. Dalam deteksi tepi, misalnya, perubahan warna yang tajam menyiratkan bahwa kita telah mencapai tepi beberapa objek dalam gambar. Misalnya, perubahan mendadak dari putih ke coklat pada gambar di bawah ini akan menandakan batas cangkir dan meja.

Cara mudah untuk menentukan jenis filter ini adalah dengan apa yang disebut "matriks konvolusi". Pustaka GD menyediakan fungsi imageconvolution($image, $matrix, $div, $offset) untuk menerapkan matriks konvolusi 3x3 ke sumber gambar $image.

Parameter $matrix adalah larik / array dari tiga array, yang masing-masing berisi tiga nilai yang dimuat — yaitu. ini adalah matriks 3x3. Elemen pertama dari array pertama dikalikan dengan nilai warna dari pixel kiri atas. Demikian pula, elemen kedua dari array pertama dikalikan dengan nilai warna pixel langsung di atas pixel pusat. Warna terakhir dari pixel diperoleh dengan menambahkan hasil dari semua perkalian ini dan kemudian membaginya dengan $div untuk dilakukan normalisasi. Normalisasi umumnya mempertahankan nilai warna akhir di bawah 255.

Seperti yang telah kita lihat, parameter $div digunakan sebagai pembagi hasil konvolusi untuk menormalkan nilainya. Di sisi lain, parameter $offset digunakan untuk menentukan nilai offset untuk semua warna. Anda akan melihat bagaimana pengaruhnya terhadap hasil akhir dalam contoh di bawah ini.

Contoh-contoh Konvolusi

Berikut adalah daftar beberapa matriks konvolusi yang berbeda yang telah kami terapkan pada gambar cangkir di atas meja.

Kotak Blur

Kotak blur bekerja dengan hanya rata-rata disetiap piksel dengan jarak piksel terdekatnya. Kami menetapkan nilai pembagi ke 9 karena penjumlahan semua elemen dalam tiga array adalah 9.

Sharpen / Mempertajam

Sharpen bekerja dengan memperbesar perbedaan antara setiap piksel dan piksel terdekatnya. Ini membuat ujungnya sedikit lebih jelas. Dalam kasus ini, pembagi masih 1 karena penjumlahan semua elemen dalam tiga array adalah 1.

Emboss / Seakan-akan Timbul

Matriks emboss mirip dengan matriks sharpen, kecuali bahwa nilai-nilai negatif ke kiri atas dan positif ke kanan bawah -itulah yang menciptakan efek emboss. Jumlah dari semua elemen dalam kasus matriks emboss konvolusi adalah 1, jadi kita tidak perlu khawatir tentang normalisasi atau penyeimbang warna.

Edge Detect / Deteksi Tepi 

Edge Detection mirip dengan sharpen, tetapi efeknya bahkan lebih kuat. Juga, nilai asli gambar tidak diberikan bobot lebih dari nilai piksel terdekatnya — itu berarti kita hanya peduli tentang tepinya, bukan area berwarna asli.

Dengan edge detection tepi, jumlah semua elemen array adalah 0. Ini artinya bahwa gambar yang akan kita dapatkan sebagian besar berwarna hitam kecuali ada perubahan warna yang tajam, yang umumnya terjadi di tepi objek. Sebagian besar gambar hitam dapat berubah menjadi putih dengan mengatur parameter offset ke 255.

Gambar berikut menunjukkan hasil dari semua matriks konvolusi ini.

Convolution Matrix

Fungsi Menyalin Gambar

PHP GD memiliki banyak fungsi untuk menyalin sebagian gambar dan kemudian mengubah ukuran atau menggabungkannya. Ketika menggunakan fungsi-fungsi ini, penting untuk diingat bahwa PHP menganggap sudut kiri atas dari sumber gambar sebagai asalnya. Nilai x positif akan membawa anda ke kanan gambar, dan nilai y positif akan membawa anda lebih jauh ke bawah.

Yang paling sederhana dari fungsi-fungsi ini adalah imagecopy( $dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h). Ini akan menyalin gambar sumber ke tempat tujuan gambar. Parameter $dst_x dan $dst_y menentukan sudut kiri atas, tempat gambar yang disalin(copy) akan ditempatkan(paste). Parameter $src_x, $src_y, $src_w, dan $src_h menentukan bagian persegi panjang dari gambar sumber, yang akan disalin ke tujuan.

Anda dapat menggunakan fungsi ini untuk memotong gambar dengan membuat gambar dari awal menggunakan imagecreatetruecolor() dan menyalin potongan (crop) persegi panjang dari gambar sumber ke dalamnya. Anda juga dapat menggunakannya untuk menambahkan watermark pada gambar, tetapi Anda harus ingat bahwa dengan metode ini, ukuran watermark tidak dapat diubah sesuai dengan ukuran gambar kami.

Salah satu solusi untuk masalah ini adalah menggunakan fungsi imagecopyresized( $dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h). Ia menerima semua parameter imagecopy() dan dua parameter tambahan untuk menentukan ukuran area tujuan dimana gambar sumber akan disalin.

Fungsi imagecopyresized() tidaklah sempurna, karena tidak menskalakan gambar ke atas dan ke bawah dengan baik. Namun, Anda bisa mendapatkan pengubahan kualitas yang lebih baik menggunakan fungsi imagecopyresampled(), yang menerima semua parameter yang sama.

Menyalin dengan Transparansi

Ada dua fungsi lain yang berhubungan dengan menyalin gambar yang akan Anda temukan sangat berguna: imagecopymerge() dan imagecopymergegray().

Fungsi imagecopymerge( $dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct) mirip dengan imagecopy(), dimana parameter tambahan $pct menentukan transparansi dari salinan gambar. Nilai 0 berarti tidak ada transparansi, dan nilai 100 berarti transparansi sceara lengkap. Ini akan sangat membantu ketika anda tidak ingin benar-benar menyembunyikan konten dari gambar utama dibelakang watermark anda.

Fungsi imagecopymergegray(), di sisi lain, menggunakan parameter terakhir untuk mengkonversi gambar sumber ke grayscale. Jika diatur ke 0, gambar sumber akan kehilangan semua warnanya. Jika diatur ke 100, gambar sumber akan tetap tidak terpengaruh.

Contoh Salinan Gambar

Contoh berikut menggunakan fungsi imagecopy() untuk mengubah bagian kanan gambar menjadi negatifnya. Kami telah membahas fungsi-fungsi lain seperti imagefilter() dan imagescale() yang digunakan dalam potongan kode ini pada tutorial sebelumnya.

Di sini, kami membuat dua salinan gambar asli, yang masing-masing telah diperkecil menjadi lebar 800 piksel. Setelah itu, kami menggunakan fungsi imagefilter() untuk membuat negatif dari sumber gambar $img_php_inv. Setengah bagian kanan gambar negatif ini kemudian disalin ke gambar asli menggunakan fungsi imagecopy().

Ini adalah penggunaan fungsi imagecopy() yang sangat dasar. Anda dapat melihat hasilnya di bawah ini. Anda juga bisa membagi gambar menjadi beberapa bagian atau garis yang lebih kecil untuk menciptakan efek gambar yang lebih menarik. Kami akan menggunakan fungsi imagecopymergegray() di potongan kode di bawah ini untuk membuat lebih banyak garis pada gambar ikan asli.

Contoh kode di atas menggunakan strategi yang mirip dengan contoh sebelumnya, tetapi kali ini kami telah membagi gambar menjadi garis-garis yang lebih kecil, yang diubah menjadi abu-abu atau tetap tidak berubah berdasarkan nilai variabel $i. Setelah menyelesaikan semua operasi penggabungan salinan, kami menerapkan dua filter pada gambar untuk membuat garis-garis menonjol.

Gambar berikut menunjukkan hasil akhir dari dua fungsi ini bersama dengan filter gambar yang berbeda.

PHP GD Fish Mosaic

Menanamkan Watermark atau Informasi Lain dalam Gambar

Beberapa organisasi menambahkan watermark pada gambar mereka untuk memperjelas bahwa mereka yang memiliki gambar tersebut. Ini juga membantu pengenalan merek dan membuat orang lain tidak suka menyalin gambar secara mencolok. Berkat PHP GD, membuat gambar dengan watermark adalah tugas yang mudah.

Dalam potongan kode di atas, kami telah membuat dua sumber gambar yang berbeda menggunakan imagecreatefromjpeg() untuk gambar utama dan imagecreatefrompng() untuk watermark masing-masing. Kami menentukan lebar dan tinggi gambar utama menggunakan fungsi imagesx() dan imagesy().

Tidak semua gambar yang ingin Anda berikan watermark akan memiliki dimensi yang sama. Jika Anda tidak mengubah ukuran watermark berdasarkan dimensi gambar utama, itu bisa terlihat aneh. Misalnya, watermark 200px mungkin terlihat bagus pada gambar 1000px, tetapi akan terlalu besar untuk gambar dengan lebar 600px, dan mungkin terlihat terlalu kecil pada gambar dengan lebar 2400px.

Oleh karena itu, kami menggunakan fungsi imagescale() untuk selalu menjaga watermark pada seperlima dari lebar gambar asli. Kami kemudian menggunakan fungsi imagecopy() untuk menempatkan watermark di lokasi yang benar. Berikut adalah hasil akhir dari potongan kode di atas.

Add Watermark to Images using GD

Selain watermark, anda juga dapat menambahkan informasi lain seperti tempat dimana foto diambil atau waktu foto diambil.

Kesimpulan

Setelah membahas dasar-dasar manipulasi gambar di tutorial kami sebelumnya, kami belajar tentang beberapa fungsi berguna lainnya dari pustaka GD. Bagian pertama dari tutorial ini membahas bagaimana kita dapat memanipulasi gambar dalam PHP menggunakan matriks konvolusi. Saya juga menunjukkan beberapa contoh operasi matriks konvolusi untuk membantu Anda memahami bagaimana PHP menghadirkan nilai-nilai warna dari piksel yang berbeda.

Bagian kedua dari tutorial menjelaskan cara menyalin (copy) dan juga mengubah ukuran bagian dari gambar untuk menempelkannya (paste) di tempat lain. Ini berguna ketika kami ingin menambahkan sesuatu ke gambar seperti watermark atau waktu foto itu diambil.

Coba gunakan semua fungsi ini untuk menciptakan beberapa efek gambar yang menarik!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.