Saya membuat perangkat penyimpanan data yang mengambil sejumlah gambar langit malam selama beberapa jam, dan gambar-gambar itu akan diunduh tepat setelah semuanya diambil. Kartu memori harus dapat menyimpan semua gambar sekaligus.
JPEG yang akan diambil adalah 640x480 piksel, dan sangat penting bahwa ada cukup ruang pada kartu memori untuk ke-100nya. Jadi apa ukuran terbesar dari JPEG 640x480?
Saya telah mengambil beberapa gambar uji untuk mencari tahu ini:
- Ukuran file dari gambar "stackoverflow" adalah 73.774 byte.
- Ukuran file gambar putih hanya 36.607 byte.
- Tetapi ukuran file untuk foto kotak-kotak jam di di 149.339 byte.
Saya mengasumsikan bahwa ukuran file meningkat dengan kompleksitas.
Bagaimana saya dapat membangun ruang yang cukup pada kartu memori agar sesuai dengan 100 640x480 JPEGS, tanpa mengetahui seberapa rumit dan bagaimana ukurannya? Saya tidak ingin menyia-nyiakan ruang ekstra karena saya mungkin membuat banyak perangkat penangkapan ini.
sumber
Jawaban:
Di sini saya menyarankan batas atas untuk ukuran file JPEG. Lihat jawaban Ilmari Karonen untuk diskusi tentang ukuran jpeg yang lebih khas.
Ruang penyimpanan piksel untuk gambar bitmap 640X480 32-bit dapat dihitung seperti itu (berdasarkan jawaban ini , tetapi dikoreksi berdasarkan komentar Ignacio Vazquez-Abrams dan jawaban ini ):
Ini adalah ukuran bitmap yang tidak terkompresi, dan karena itu harus menjadi batas atas untuk ukuran file jpeg (Pada kenyataannya, karena format JPEG menggunakan kompresi , gambar Anda harus jauh lebih kecil, terutama mengingat Anda mengambil gambar malam itu). langit, yang saya bayangkan mengandung banyak warna hitam. Perhatikan bahwa contoh gambar terbesar dalam pertanyaan Anda hanya 0,14 MB).
Mengenai masalah spesifik Anda, meskipun menggunakan batas atas itu, 100 gambar hanya 117 MB, dan sudah lama sejak saya melihat kartu memori sekecil 128 MB. Saya menduga kartu memori yang tersedia saat ini akan memiliki kapasitas yang cukup untuk memenuhi kebutuhan Anda.
Rupanya masalah ukuran file jpeg maksimum menjadi bahan perdebatan. Ini jawaban Stack Overflow menunjukkan ukuran maksimum teoritis 20,25 byte per pixel, atau 5,9 MB dalam kasus Anda, tetapi menghasilkan gambar dengan ukuran yang memerlukan penyalahgunaan yang disengaja dari skema kompresi format jpeg, jadi itu sangat tidak mungkin bahwa Anda pernah akan melihat seperti sesuatu yang diproduksi oleh kamera.
sumber
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 :
(Kebisingan RGB acak seragam, format PNG lossless, 903 kb)
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:(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:(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 .
sumber