Sekadar memeriksa, izinkan saya menguji analisis ForeverWintr secara eksperimental.
Jenis gambar input terburuk untuk kompresi JPEG (atau kompresi apa pun , sebenarnya) adalah noise RGB acak yang seragam, yang secara teoritis tidak dapat dimampatkan. Jadi izinkan saya menghasilkan beberapa menggunakan alat netpbm :
$ rawtoppm < /dev/urandom 640 480 > rnd.ppm
$ pnmtopng < rnd.ppm > rnd.png
$ du -b rnd.*
923772 rnd.png
921615 rnd.ppm
(Kebisingan RGB acak seragam, format PNG lossless, 903 kb)
Catatan (Maret 2017): Saya cukup yakin gambar di atas adalah dalam format PNG ketika saya pertama kali menulis jawaban ini dan upload kembali pada tahun 2013. Sayangnya, itu akan (Bahkan ada komentar tentang manajemen warna di bawah sangat menyiratkan ini.) tampaknya telah diam-diam diubah menjadi JPEG di beberapa titik, membuat perbandingan visual di sini tidak berguna.
Saya sudah mencoba mengunggah ulang gambar uji PNG yang baru, tetapi ternyata itu menyentuh semacam batas ukuran file PNG sewenang-wenang di imgur dan otomatis dikonversi ke JPEG. Saya tidak yakin apakah ada jalan keluar masalah ini, tetapi setidaknya jika Anda memiliki akses ke kotak Linux, Anda selalu dapat menjalankan kembali perintah yang diberikan untuk menghasilkan gambar pengujian Anda sendiri. Bagaimanapun, selain mencegah perbandingan visual langsung dari kualitas kompresi, ini tidak membatalkan analisis di bawah ini dengan cara apa pun.
OK, jadi file PPM yang tidak terkompresi adalah 640 × 480 × 3 = 921.600 byte, ditambah 15 byte untuk header PPM minimal, seperti yang diharapkan. Mencoba mengompres tanpa kehilangan dengan menggunakan format PNG akhirnya meningkatkan ukurannya menjadi 2157 byte, mungkin diambil oleh header dan metadata PNG dan mungkin beberapa sedikit inefisiensi dalam algoritma kompresi yang mencoba mengompres data yang tidak dapat dimampatkan.
(Ya, itu 3 byte per pixel, bukan 4; bahkan format PPM, yang semudah format file grafik bisa, tidak cukup bodoh untuk menyimpan byte keempat yang tidak berguna per pixel pada disk. Mungkin ada beberapa keuntungan melakukannya di memori untuk alasan penyelarasan, terutama jika Anda juga perlu menyimpan saluran alfa, tetapi alasan itu tidak berlaku saat menulis gambar ke file.)
OK, jadi bagaimana dengan JPEG? Mari kita coba meminimalkan kerugian kompresi terlebih dahulu (kualitas = 100, tidak ada kroma subsampling, floating-point DCT). Sayangnya, pnmtojpeg
manual ini tidak menjelaskan dengan jelas cara mengatur semua opsi yang relevan (khususnya, -sample
opsi ini terdaftar di bagian "Opsi untuk penyihir", yang hanya mereferensikan file di dokumentasi libjpeg), jadi saya akan mengonversinya dalam GIMP sebagai gantinya. File yang dihasilkan terlihat seperti ini:
897249 rnd.jpg
(JPEG noise RGB terkompresi, kualitas = 100, tidak ada subsampel kroma, 876 kb)
Apa, bagaimana bisa lebih kecil? Bukankah saya hanya mengatakan suara murni itu tidak bisa dimampatkan? Yah, masalahnya adalah, bahkan pada kualitas maksimum, kompresi JPEG normal tidak cukup lossless. Membuka kembali gambar dalam GIMP dan membandingkannya dengan aslinya, orang dapat melihat bahwa beberapa piksel memiliki nilai warna yang digeser oleh satu atau dua langkah (dari 256). Itu adalah piksel di mana algoritma kompresi JPEG "curang" dan membuang sedikit di sini, yang lain di sana, di mana ia memperkirakan bahwa perubahan itu tidak akan terlihat. Memang, bagi mata manusia tanpa bantuan, hasilnya cukup tidak dapat dibedakan dari aslinya, tetapi bit yang dibuang itu menambah penurunan ukuran file yang terukur, bahkan setelah memperhitungkan header dan pengkodean overhead.
Jadi itu kualitas maksimal; bagaimana dengan pengaturan yang lebih khas, seperti pnmtojpeg
default (kualitas = 75, subsampling diaktifkan)? Mari kita coba:
$ pnmtojpeg < rnd.ppm > rnd2.jpg
$ du -b rnd2.jpg
185128 rnd2.jpg
(JPEG noise RGB terkompresi, kualitas = 75, subsampel kroma, 184 kb)
Wow, dari 901 ke 184 kb! Namun, itu adalah kompresi yang cukup agresif, dan Anda pasti dapat membedakannya ketika membandingkan gambar dengan cermat. Sebagian besar itu karena chroma subsampling, yang pada dasarnya hanya membuang 75% dari data warna (rona / saturasi). Mencoba di GIMP dengan menonaktifkan subsampling memberikan file 350.618 byte yang masih terlihat (menurut mata manusia, setidaknya) cukup dekat dengan aslinya bahkan ketika diperbesar.
Bagaimanapun, inti dari semua ini adalah untuk menunjukkan bahwa, tidak peduli seberapa berisik foto langit malam Anda mungkin, dan tidak peduli seberapa tinggi kualitas yang Anda pilih, tidak ada cara 640x480 file JPEG bisa secara signifikan lebih besar dari 900 kb. (Ya, kecuali jika kamera Anda memasang profil warna Exif multi-megabyte atau sesuatu yang sama-sama bodoh, itu.) Dan jika Anda menggunakan pengaturan kompresi JPEG yang lebih khas, ukuran file maksimum yang masuk akal turun menjadi sekitar 200 kb atau lebih .