Apa ukuran terbesar dari 640x480 JPEG?

25

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:

# 1# 2# 3

  • 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.

Es biru
sumber
itu tergantung pada produsen gambar. JPEG 100-kualitas dapat dengan mudah meledak dalam ukuran. Apa pengaturan kamera dan kamera Anda?
John Dvorak
Kamera uji adalah Canon Powershot A1100 IS. Untuk info lebih lanjut, Anda dapat memeriksa metadata, karena saya tidak yakin apa yang Anda minta.
Blue Ice
1
SETELAH Anda mengambil sampel gambar langit malam di dif. Pengaturan Q? Sebagai ujian?
Carl B
2
Apa ini untuk ? Apakah Anda yakin jpeg adalah pilihan format yang tepat.
Jack Aidley
3
Tambahkan beberapa latar belakang komentar Jack Aidleys: Kompresi JPEG mengubah gambar. Itu membuat asumsi dan membuang informasi untuk mendapatkan ukuran file yang lebih kecil. (Kecuali jika diatur ke kualitas 100%, dalam hal ini Anda mungkin juga menggunakan format yang tidak terkompresi. Seringkali kamera digital memiliki tiff atau bahkan pengaturan mentah untuk ini. Jika Anda ingin menyimpan semua titik kecil seperti bintang maka gunakan salah satu dari ini). Ini juga akan membuat ukuran gambar benar-benar dapat diprediksi.
Hennes

Jawaban:

22

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 ):

Dengan asumsi bahwa tidak ada kompresi yang diterapkan pada file, ada 307.200 piksel, yang merupakan 0.3MP. Berguna mencari meja

Jika setiap piksel berisi 32 bit informasi, maka

  1. 307.200 * 32 = 9.830.400 bit informasi
  2. Dibagi dengan 8 bit menjadi nilai byte
  3. 9,830.400 / 8 = 1228800 byte (Atau 1,17 Mb)

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.

ForeverWintr
sumber
1
Sayangnya bahkan nilai bitmap yang tidak terkompresi hanya sedikit rendah, karena mengasumsikan pengemasan. Bitmap yang tidak dibongkar menggunakan 32 bit per piksel (untuk alasan penyelarasan ), meningkatkan ukuran file sebesar 33%.
Ignacio Vazquez-Abrams
Terima kasih @ IgnacioVazquez-Abrams. Itu yang saya dapatkan dengan menganggap jawaban yang diterima benar.
ForeverWintr
1
@ IgnacioVazquez-Abrams - "Alignment" adalah atribut yang ditentukan oleh prosesor (bukan media penyimpanan), dan nyaman saat data dalam RAM untuk diproses. Untuk tujuan penyimpanan, perataan kata 32-bit bukanlah suatu keharusan dan tentu saja merupakan kemewahan. Pengepakan data adalah operasi umum sebelum penulisan ke penyimpanan, terutama untuk penghematan 25% tertentu. Saya telah melihat kamera digital yang menyimpan setiap piksel tepat 3 byte untuk format mentah.
serbuk gergaji
1
"... tentu saja boros." Sekarang. Beberapa bulan yang lalu itu dianggap sebagai fitur hemat siklus (tidak perlu menyelaraskan pada beban, mengingat berapa lama waktu yang dibutuhkan).
Ignacio Vazquez-Abrams
3
Dalam praktiknya, sementara beberapa sistem mungkin menyimpan data gambar RGB sebagai 4 byte per piksel dalam memori , hampir semua format file gambar paling banyak menggunakan 3 byte per piksel (kecuali ada saluran alfa sebenarnya yang disimpan dalam byte keempat). Lihat jawaban saya di bawah ini.
Ilmari Karonen
35

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
(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, pnmtojpegmanual ini tidak menjelaskan dengan jelas cara mengatur semua opsi yang relevan (khususnya, -sampleopsi 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
(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 pnmtojpegdefault (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
(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 .

Ilmari Karonen
sumber
4
secara teoritis tidak dapat dikompresi hanya untuk kompresi lossless, kan?
Daniel Beck
1
@DanielBeck: Benar. Jelas, Anda dapat memampatkan data apa pun sebanyak yang Anda inginkan jika Anda rela membuang sebagian saja. (Pada dasarnya apa yang dilakukan kompresi JPEG, ia hanya mencoba melakukannya sedemikian rupa sehingga bagian yang hilang tidak terlihat oleh mata manusia, dan apa yang tersisa dapat dikodekan secara kompak. Kebisingan masih merupakan kasus yang sulit untuk itu, karena Satu-satunya hal yang dapat dilakukan oleh algoritma kompresi lossy dengan noise adalah membuangnya.)
Ilmari Karonen
Mungkin itu hanya saya, tetapi gambar kedua terlihat lebih cerah dari yang pertama.
Bogdacutu
@Bogdacutu: Seharusnya tidak, meskipun selalu mungkin bahwa browser Anda mungkin melakukan sesuatu yang aneh dengan manajemen warna dll. Cobalah memuat keduanya dalam editor grafis dan membandingkan nilai warna.
Ilmari Karonen
Langgan @Ilmari yang bagus.
ForeverWintr