Bisakah kita mengubah ukuran gambar JPEG tanpa decoding dan encoding ulang?

12

Saya ingin mengonversi gambar JPEG 640x480 ke 320x240. Saya tahu itu bisa dilakukan dengan mendekode gambar JPEG menjadi YCbCr mentah, skala dan encode ulang menjadi JPEG. Tetapi apakah mungkin dengan encoding JPEG untuk secara langsung skala gambar tanpa decoding?

Necktwi
sumber

Jawaban:

14

Anda bisa, tetapi hanya jika penampil JPEG Anda mendukung ekstensi SmartScale JPEG. jpegtran dapat melakukan ini untuk ukuran N / 8, dengan N = 1..16. Pada dasarnya, ukuran blok DCT diubah dari 8x8 menjadi sesuatu yang lain selama kompresi ulang (misalnya 4x4), yang secara efektif mengukur skala gambar.

Catatan: SmartScale diperkenalkan dalam versi 8 dari libjpeg library, tetapi tidak didukung secara luas oleh pemirsa.

Sebuah dokumen yang menjelaskan perubahan secara rinci dapat ditemukan di sini: Evolusi JPEG .

EDIT: Tampaknya sebagian besar pemirsa tidak dapat benar-benar menampilkan gambar-gambar ini, karena mereka didasarkan pada libjpeg-turbo. Dan libjpeg-turbo memilih untuk tidak mengimplementasikan fitur ini . Sebenarnya, saya sudah mencoba beberapa program (di Ubuntu 14.04 dan Windows 8) dan tidak ada yang bisa menampilkan gambar downscaled yang dibuat menggunakan jpegtrans. Bahkan Photoshop, IrfanView, dan GIMP gagal.

EDIT 2: Faktanya, Ubuntu dan Fedora bahkan tidak mengirimkan pustaka libjpeg8, tetapi sepenuhnya menggantinya dengan versi libjpeg-turbo. Jadi tidak ada program yang dapat membaca file JPEG SmartScale, simpan untuk beberapa binari yang secara statis terhubung ke pustaka libjpeg8 asli.

jmiserez
sumber
Apakah ada codec yang membangun gambar yang tumbuh hanya dengan menambahkan data lebih lanjut ke gambar?
Necktwi
bagaimana dengan jpeg progresif? Bukankah itu tepat seperti yang saya minta?
Necktwi
Tidak, itu melakukan sesuatu yang sedikit berbeda dengan meningkatkan kualitas gambar (dari rendah ke penuh), tetapi resolusinya selalu tidak berubah ( referensi ). Namun, ada ekstensi JPEG lain yang disebut "mode hierarkis", yang menyandikan resolusi yang berbeda ( lihat juga di sini ). Tetapi sekali lagi, libjpeg-turbo tidak mendukungnya (lihat di sini , cari "progresif" dalam teks).
jmiserez
1
Dan untuk menjawab komentar pertama, tentu saja ada codec semacam itu. Hanya bukan JPG. Apa yang Anda cari disebut gambar piramida, atau representasi multiskala. Misalnya JPEG2000 menggunakan transformasi wavelet yang menciptakan piramida wavelet. Ada piramida lain, seperti piramida Gaussian atau Laplacian. Slideset ini memberikan gambaran yang baik tentang bagaimana segala sesuatu bekerja, sementara JPEG2000 dibahas di sini dan di sini .
jmiserez
Terima kasih atas informasi tentang format JPEG baru. Saya tidak berharap banyak gambar sumber (kamera, pemindai, dll) untuk menggunakannya.
AFH
3

Jawaban singkatnya adalah tidak. Gambar JPEG menggunakan kompresi, yang berarti bahwa setiap byte keluaran bergantung pada yang lainnya. Jika Anda mengubah jumlah byte gambar, maka Anda harus mendekompres dan mengkompres ulang.

Akan ada kehilangan kualitas sebagai hasil dari kompresi ulang, karena JPEG menggunakan kompresi lossy, tetapi Anda tetap kehilangan kualitas dengan memecah resolusi. Anda bisa mendapatkan kualitas terbaik dari gambar beresolusi rendah dengan meningkatkan tingkat kualitas JPEG saat melakukan kompresi ulang, meskipun ini tentu saja akan meningkatkan ukuran file.

Jika Anda melakukan banyak pekerjaan dengan gambar, yang terbaik adalah bekerja dalam format kompresi lossless, seperti PNG, mengkonversi ke JPEG hanya ketika gambar selesai, asalkan tentu saja Anda memiliki ruang disk tambahan.

AFH
sumber