Mengelola gambar dalam website adalah hal penting, terutama untuk optimasi performa dan tampilan. Salah satu teknik yang sering digunakan adalah membuat versi resize dan thumbnail dari gambar yang diupload.
Pada tutorial ini, kamu akan belajar cara memproses gambar menggunakan PHP, AJAX, dan GD Library, termasuk resize, crop, dan pembuatan thumbnail otomatis.
Apa Itu GD Library
GD Library adalah library bawaan PHP yang digunakan untuk memproses gambar seperti:
- Resize gambar
- Crop gambar
- Membuat thumbnail
- Mengubah format gambar
Library ini wajib aktif jika kamu ingin memanipulasi gambar menggunakan PHP.
Alur Proses Upload dan Resize
Berikut alur kerja dari sistem ini:
- User mengupload gambar melalui AJAX
- Server menerima file
- Gambar diproses (resize dan crop)
- Thumbnail dibuat otomatis
- Data disimpan ke database
- Data dikembalikan dalam format JSON
Contoh Kode PHP Resize dan Thumbnail
Berikut implementasi lengkapnya:
if (isset($_POST['action']) && $_POST['action'] == 'edit') {
$nama_file_lama = $_POST['nama_file_lama'];
if ($_FILES['gambar']['error'] === UPLOAD_ERR_OK) {
$nama_file = basename($_FILES['gambar']['name']);
$ekstensi_file = strtolower(pathinfo($nama_file, PATHINFO_EXTENSION));
if (in_array($ekstensi_file, array('jpg', 'jpeg', 'png', 'gif'))) {
$nama_file = uniqid() . '.' . $ekstensi_file;
$lokasi_file = 'uploads/' . $nama_file;
$lokasi_file_thumbnail = 'uploads/thumbnail_' . $nama_file;
move_uploaded_file($_FILES['gambar']['tmp_name'], $lokasi_file);
switch ($ekstensi_file) {
case 'jpg':
case 'jpeg':
$gambar = imagecreatefromjpeg($lokasi_file);
break;
case 'png':
$gambar = imagecreatefrompng($lokasi_file);
break;
case 'gif':
$gambar = imagecreatefromgif($lokasi_file);
break;
}
$lebar_gambar = imagesx($gambar);
$tinggi_gambar = imagesy($gambar);
$ukuran_canvas = 500;
$ukuran_thumbnail = 150;
$canvas = imagecreatetruecolor($ukuran_canvas, $ukuran_canvas);
$canvas_thumbnail = imagecreatetruecolor($ukuran_thumbnail, $ukuran_thumbnail);
$skala = min($ukuran_canvas / $lebar_gambar, $ukuran_canvas / $tinggi_gambar);
$posisi_crop_x = ($lebar_gambar - $ukuran_canvas / $skala) / 2;
$posisi_crop_y = ($tinggi_gambar - $ukuran_canvas / $skala) / 2;
imagecopyresampled($canvas, $gambar, 0, 0, $posisi_crop_x, $posisi_crop_y, $ukuran_canvas, $ukuran_canvas, $lebar_gambar - 2 * $posisi_crop_x, $tinggi_gambar - 2 * $posisi_crop_y);
imagecopyresampled($canvas_thumbnail, $gambar, 0, 0, $posisi_crop_x, $posisi_crop_y, $ukuran_thumbnail, $ukuran_thumbnail, $lebar_gambar - 2 * $posisi_crop_x, $tinggi_gambar - 2 * $posisi_crop_y);
switch ($ekstensi_file) {
case 'jpg':
case 'jpeg':
imagejpeg($canvas, $lokasi_file);
imagejpeg($canvas_thumbnail, $lokasi_file_thumbnail);
break;
case 'png':
imagepng($canvas, $lokasi_file);
imagepng($canvas_thumbnail, $lokasi_file_thumbnail);
break;
case 'gif':
imagegif($canvas, $lokasi_file);
imagegif($canvas_thumbnail, $lokasi_file_thumbnail);
break;
}
unlink($_POST['nama_file_lama']);
unlink($_POST['nama_file_lama_thumbnail']);
imagedestroy($gambar);
imagedestroy($canvas);
imagedestroy($canvas_thumbnail);
}
}
$sql = "UPDATE gambar SET nama = '" . $_POST['nama'] . "', deskripsi = '" . $_POST['deskripsi'] . "', nama_file = '" . $nama_file . "', nama_file_thumbnail = '" . $lokasi_file_thumbnail . "' WHERE id = " . $_POST['id'];
$conn->query($sql);
$sql = "SELECT * FROM gambar WHERE id = " . $_POST['id'];
$result = $conn->query($sql);
$row = $result->fetch_assoc();
echo json_encode($row);
}
Penjelasan Proses Resize
Beberapa poin penting dalam kode:
- imagecreatefromjpeg/png/gif digunakan untuk membaca gambar
- imagecreatetruecolor membuat canvas baru
- imagecopyresampled digunakan untuk resize dan crop
- ukuran canvas menentukan hasil akhir gambar
- thumbnail dibuat dengan ukuran lebih kecil
Fungsi Crop Otomatis
Kode di atas tidak hanya resize, tapi juga melakukan crop otomatis agar gambar tetap proporsional (square).
Ini penting untuk:
- Thumbnail berita
- Foto profil
- Gallery
Penyimpanan ke Database
Setelah gambar diproses, data disimpan ke database:
- nama
- deskripsi
- nama file utama
- nama file thumbnail
Kemudian data dikembalikan dalam format JSON untuk digunakan oleh AJAX.
Catatan Penting
Agar fitur ini berjalan dengan baik, pastikan:
- GD Library sudah aktif di server
- Folder uploads memiliki permission write
- Validasi file dilakukan (ukuran & tipe)
- Gunakan prepared statement untuk keamanan
Kesimpulan
Menggunakan PHP dan GD Library, kamu bisa membuat sistem upload gambar yang lebih profesional dengan fitur resize dan thumbnail otomatis.
Teknik ini sangat penting untuk:
- Website berita
- Blog
- Marketplace
- Sistem manajemen konten
Dengan optimasi gambar yang baik, website kamu akan lebih cepat, ringan, dan SEO friendly.
Kalau kamu mau, kita bisa lanjut ke versi advanced seperti upload dengan preview, drag & drop, atau kompresi gambar otomatis biar performa makin maksimal.