Pilih level kompresi yang benar

Gambar sering kali menempati sebagian besar byte yang didownload di halaman web dan juga sering kali menempati sejumlah besar ruang visual. Akibatnya, mengoptimalkan gambar sering kali dapat menghasilkan beberapa penghematan byte terbesar dan meningkatkan performa untuk situs Anda: semakin sedikit byte yang harus didownload browser, semakin sedikit persaingan untuk bandwidth klien dan semakin cepat browser mendownload dan merender konten yang berguna pada layar.

Pengoptimalan gambar adalah seni dan sains: seni karena tidak ada jawaban pasti tentang cara terbaik mengompresi gambar individual, dan sains karena ada banyak teknik dan algoritma yang dikembangkan dengan baik yang dapat secara signifikan mengurangi ukuran gambar. Analisis cermat untuk berbagai dimensi diperlukan guna menemukan setelan yang optimal untuk gambar Anda: kemampuan format, konten data yang dienkode, kualitas, dimensi piksel, dan lainnya.

Mengoptimalkan gambar vektor

Semua browser modern mendukung Scalable Vector Graphics (SVG), yang merupakan format gambar berbasis XML untuk grafis dua dimensi. Anda dapat menyematkan markup SVG langsung di halaman atau sebagai resource eksternal. Sebagian besar software menggambar berbasis vektor dapat membuat file SVG, atau Anda dapat menulisnya dengan tangan langsung di editor teks favorit Anda.

<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<svg version="1.2" baseProfile="tiny" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
    x="0px" y="0px" viewBox="0 0 612 792" xml:space="preserve">
<g id="XMLID_1_">
  <g>
    <circle fill="red" stroke="black" stroke-width="2" stroke-miterlimit="10" cx="50" cy="50" r="40"/>
  </g>
</g>
</svg>

Contoh di atas merender bentuk lingkaran sederhana di bawah dengan garis luar hitam dan latar belakang merah dan diekspor dari Adobe Illustrator.

<?xml version="1.0" encoding="utf-8"?>

Seperti yang dapat Anda lihat, file ini berisi banyak metadata, seperti informasi lapisan, komentar, dan namespace XML yang sering kali tidak diperlukan untuk merender aset di browser. Oleh karena itu, sebaiknya perkecil file SVG dengan menjalankan alat seperti SVGO.

Untuk kasus ini, SVGO mengurangi ukuran file SVG di atas yang dihasilkan oleh Illustrator sebesar 58%, menjadinya 470 menjadi 199 byte.

<svg version="1.2" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 612 792"><circle fill="red" stroke="#000" stroke-width="2" stroke-miterlimit="10" cx="50" cy="50" r="40"/></svg>

Karena SVG adalah format berbasis XML, Anda juga dapat menerapkan kompresi GZIP untuk mengurangi ukuran transfernya—pastikan server Anda dikonfigurasi untuk mengompresi aset SVG.

Gambar raster hanyalah petak dua dimensi yang terdiri dari "piksel" individual—misalnya, gambar 100x100 piksel adalah urutan 10.000 piksel. Pada gilirannya, setiap piksel menyimpan nilai "RGBA": saluran merah (R), saluran hijau (G), saluran biru (B), dan (A) saluran alfa (transparansi).

Secara internal, browser mengalokasikan 256 nilai (nuansa) untuk setiap saluran, yang berarti 8 bit per saluran (2 ^ 8 = 256), dan 4 byte per piksel (4 saluran x 8 bit = 32 bit = 4 byte). Hasilnya, jika kita mengetahui dimensi {i>grid<i}, kita dapat dengan mudah menghitung ukuran file:

  • Gambar 100x100 piksel terdiri dari 10.000 piksel
  • 10.000 piksel x 4 byte = 40.000 byte
  • 40.000 byte / 1024 = 39 KB
Dimensi Piksel Ukuran file
100 x 100 10.000 39 KB
200 x 200 40.000 156 KB
300x300 90.000 351 KB
500 x 500 250.000 977 KB
800 x 800 640.000 2.500 KB

39 KB untuk gambar berukuran 100x100 piksel mungkin tidak terlihat besar, tetapi ukuran file dengan cepat meledak untuk gambar yang lebih besar dan membuat aset gambar lambat dan mahal untuk didownload. Postingan ini sejauh ini hanya berfokus pada format gambar yang "tidak dikompresi". Untungnya, banyak hal yang bisa dilakukan untuk mengurangi ukuran file gambar.

Salah satu strategi sederhananya adalah mengurangi "kedalaman bit" gambar dari 8 bit per saluran menjadi palet warna yang lebih kecil: 8 bit per saluran memberi kita 256 nilai per saluran dan total 16.777.216 (256 ^ 3) warna. Bagaimana jika Anda mengurangi palet menjadi 256 warna? Maka Anda hanya akan memerlukan total 8 bit untuk saluran RGB dan segera menghemat dua byte per piksel - itu adalah penghematan kompresi 50% dibandingkan dengan 4 byte asli per format piksel!

Artefak kompresi
Kiri ke kanan (PNG): 32-bit (16 juta warna), 7-bit (128 warna), 5-bit (32 warna).

Scene kompleks dengan transisi warna bertahap (misalnya, gradien atau langit) memerlukan palet warna yang lebih besar untuk menghindari artefak visual seperti langit yang pecah dalam aset 5-bit. Di sisi lain, jika gambar hanya menggunakan beberapa warna, maka palet besar hanya akan membuang-buang bit yang berharga!

Berikutnya, setelah mengoptimalkan data yang disimpan dalam setiap piksel, Anda bisa menjadi lebih cerdas dan juga melihat piksel di sekitar: ternyata, banyak gambar, dan terutama foto, memiliki banyak piksel terdekat dengan warna yang serupa— misalnya, langit, tekstur berulang, dan seterusnya. Dengan menggunakan informasi ini, kompresor dapat menerapkan encoding delta. Di sini, Anda dapat menyimpan perbedaan antara piksel terdekat, bukan menyimpan nilai individual untuk setiap piksel: jika piksel yang berdekatan sama, maka delta adalah "nol" dan Anda hanya perlu menyimpan satu bit. Tapi mengapa berhenti di situ...

Mata manusia memiliki tingkat sensitivitas yang berbeda terhadap warna yang berbeda: Anda dapat mengoptimalkan encoding warna untuk memperhitungkan hal ini dengan mengurangi atau meningkatkan palet untuk warna tersebut. Piksel "Di Sekitar" membentuk petak dua dimensi. Ini berarti setiap piksel memiliki beberapa tetangga: Anda dapat menggunakan fakta ini untuk meningkatkan encoding delta lebih lanjut. Daripada hanya melihat tetangga terdekat untuk setiap piksel, Anda dapat melihat blok piksel terdekat yang lebih besar dan mengenkode blok yang berbeda dengan setelan berbeda.

Seperti yang Anda lihat, pengoptimalan gambar menjadi semakin rumit (atau menyenangkan, tergantung perspektif Anda), dan merupakan bidang riset akademis dan komersial yang aktif. Gambar menempati banyak byte dan mengembangkan teknik kompresi gambar yang lebih baik akan sangat bermanfaat. Jika Anda ingin mempelajari lebih lanjut, buka halaman Wikipedia, atau baca laporan resmi teknik kompresi WebP untuk mengetahui contoh praktiknya.

Sekali lagi, semuanya bagus, tetapi juga sangat akademis: bagaimana hal ini dapat membantu mengoptimalkan gambar di situs Anda? Nah, penting untuk memahami bentuk masalah: {i>pixel<i} RGBA, bit-depth, dan berbagai teknik pengoptimalan. Semua konsep ini penting untuk dipahami dan diingat sebelum Anda masuk ke diskusi mengenai berbagai format gambar raster.

Kompresi gambar lossless versus lossy

Untuk jenis data tertentu, seperti kode sumber untuk halaman, atau file yang dapat dieksekusi, kompresor tidak boleh mengubah atau kehilangan informasi asli: satu bit data yang hilang atau salah dapat sepenuhnya mengubah makna konten file, atau lebih buruk lagi, merusaknya sepenuhnya. Untuk beberapa jenis data lainnya, seperti gambar, audio, dan video, pengiriman sebuah representasi "perkiraan" dari data asli mungkin dapat diterima.

Faktanya, karena cara kerja mata, kita sering kali dapat membuang beberapa informasi tentang setiap piksel untuk mengurangi ukuran file gambar— misalnya, mata memiliki sensitivitas yang berbeda terhadap warna yang berbeda, yang berarti kita dapat menggunakan lebih sedikit bit untuk mengenkode beberapa warna. Akibatnya, pipeline pengoptimalan gambar umumnya terdiri dari dua langkah tingkat tinggi:

  1. Gambar diproses dengan filter lossy yang menghapus beberapa data piksel.
  2. Gambar diproses dengan filter lossless yang mengompresi data piksel.

Langkah pertama bersifat opsional, dan algoritma yang tepat akan bergantung pada format gambar tertentu, tetapi penting untuk dipahami bahwa gambar apa pun dapat menjalani langkah kompresi lossy untuk mengurangi ukurannya. Faktanya, perbedaan antara berbagai format gambar, seperti GIF, PNG, JPEG, dan lainnya, adalah kombinasi dari algoritma spesifik yang digunakan (atau dihilangkan) saat menerapkan langkah lossy dan lossless.

Jadi, apa konfigurasi pengoptimalan lossy dan lossless yang "optimal"? Jawabannya bergantung pada konten gambar dan kriteria Anda sendiri seperti kompromi antara ukuran file dan artefak yang diperkenalkan oleh kompresi lossy: Dalam beberapa kasus, Anda mungkin ingin melewati pengoptimalan lossy untuk mengomunikasikan detail yang rumit dalam fidelitas penuhnya. Dalam kasus lainnya, Anda dapat menerapkan pengoptimalan lossy yang agresif untuk mengurangi ukuran file aset gambar. Di sinilah penilaian dan konteks Anda sendiri perlu digunakan—tidak ada setelan universal.

Sebagai contoh praktik, saat menggunakan format lossy seperti JPEG, kompresor biasanya akan menampilkan setelan "kualitas" yang dapat disesuaikan (misalnya, penggeser kualitas yang disediakan oleh fungsi "Save for Web" di Adobe Photoshop), yang biasanya berupa angka antara 1 dan 100 yang mengontrol cara kerja bagian dalam pada kumpulan algoritma lossy dan lossless tertentu. Untuk hasil terbaik, bereksperimenlah dengan berbagai setelan kualitas gambar, dan jangan takut untuk menurunkan kualitas gambar—hasil visualnya sering kali sangat bagus dan penghematan ukuran filenya bisa cukup besar.

Efek kompresi gambar terhadap Data Web Inti

Karena gambar sering kali merupakan kandidat untuk Largest Contentful Paint, mengurangi waktu pemuatan resource untuk gambar dapat menghasilkan LCP yang lebih baik, baik di lab maupun di kolom.

Saat menggunakan setelan kompresi pada format gambar raster, pastikan untuk bereksperimen dengan format WebP dan AVIF, guna melihat apakah Anda dapat mengirimkan gambar yang sama dalam jejak yang kecil dibandingkan dengan format yang lebih lama.

Namun, Anda harus berhati-hati agar tidak mengompresi secara berlebihan gambar raster. Solusi yang bagus adalah menggunakan CDN pengoptimalan gambar untuk menemukan setelan kompresi terbaik untuk Anda, tetapi alternatifnya mungkin menggunakan alat seperti Butteraugli untuk memperkirakan perbedaan visual sehingga Anda tidak mengenkode gambar terlalu secara agresif dan kehilangan terlalu banyak kualitas.

Checklist pengoptimalan gambar

Beberapa tips dan teknik yang perlu diingat saat Anda mengoptimalkan gambar:

  • Pilih format vektor: gambar vektor tidak bergantung pada resolusi dan skala, sehingga sangat cocok untuk lingkungan multiperangkat dan resolusi tinggi.
  • Minifikasi dan kompresi aset SVG: Markup XML yang dihasilkan oleh sebagian besar aplikasi gambar sering kali berisi metadata yang tidak diperlukan yang dapat dihapus; Pastikan server Anda dikonfigurasi untuk menerapkan kompresi GZIP untuk aset SVG.
  • Pilih WebP atau AVIF daripada format raster lama: WebP dan gambar AVIF biasanya akan jauh lebih kecil daripada format gambar yang lama.
  • Pilih format gambar raster terbaik: tentukan persyaratan fungsi Anda, lalu pilih yang sesuai untuk setiap aset tertentu.
  • Bereksperimen dengan setelan kualitas yang optimal untuk format raster: jangan takut untuk menurunkan setelan "kualitas". Hasilnya sering kali sangat bagus dan penghematan byte-nya signifikan.
  • Hapus metadata gambar yang tidak diperlukan: banyak gambar raster berisi metadata yang tidak diperlukan mengenai aset: informasi geografis, informasi kamera, dst. Gunakan alat yang sesuai untuk menghapus data ini.
  • Tampilkan gambar yang diperkecil: ubah ukuran gambar dan pastikan ukuran "tampilan" sedekat mungkin dengan ukuran gambar yang "alami". Perhatikan baik-baik gambar yang besar, karena menjelaskan overhead terbesar saat diubah ukurannya.
  • Otomatiskan, otomatiskan, otomatiskan: manfaatkan alat dan infrastruktur otomatis yang akan memastikan semua aset gambar Anda selalu dioptimalkan.