Bagaimana saya bisa menambahkan perbatasan ke foto JPEG tanpa mempengaruhi kualitas?

24

Saya punya foto dalam format JPEG dengan resolusi 4680x3120. Saya ingin menambahkan garis putih di sekitar foto ini, mengubahnya menjadi foto 5200x3467 (untuk alasan pencetakan).

Jelas, saya tidak mengubah atau menghapus apa pun dari foto, saya hanya menambahkan sesuatu. Karena itu, pada prinsipnya prosedur ini bisa menjadi lossless. Namun, jika saya menggunakan Paint untuk menambahkan perbatasan ini, proses Saving of Paint akan memampatkan foto lagi ke dalam format JPEG, sehingga kehilangan informasi dan kualitas.

Apakah ada cara (beberapa program yang lebih profesional) untuk menambahkan sesuatu ke foto JPEG, seperti perbatasan, tanpa mempengaruhi bagian asli foto, tanpa mengurangi kualitasnya?

LBogaardt
sumber

Jawaban:

35

Meskipun jawaban Philip adalah cara terbaik untuk pergi, adalah mungkin untuk melakukan apa yang Anda inginkan sepenuhnya dalam lingkup JPEG.

JPEG bekerja dengan memecah gambar Anda menjadi blok-blok yang disebut Unit Pengodean Minimum (MCU), masing-masing 16x16, dan mengompresnya secara terpisah. Anda dapat melihat ini di gambar ketika Anda menghidupkan tingkat kompresi sangat tinggi. Pada tingkat kompresi yang lebih masuk akal, balok menyatu begitu lancar sehingga Anda tidak pernah melihat batas.

Kita bisa memanfaatkan fakta ini untuk menambahkan batas putih sederhana ke gambar. Kami hanya harus membuat array berongga blok putih yang sama dengan ukuran gambar output, lalu jatuhkan blok JPEG MCU asli ke tengah .¹

Ada kerugian untuk teknik itu: itu hanya bekerja ketika ukuran gambar input dan output keduanya kelipatan dari ukuran MCU. Ketika itu tidak terjadi, kita perlu mengkompres ulang beberapa blok di margin antara batas putih dan tepi gambar asli. Anda tidak akan melihat perbedaan ini dalam output jika Anda menjauh dari level kompresi JPEG yang terlalu tinggi, sehingga masih efektif lossless.

Saya tidak mengetahui adanya program yang hanya melakukan ini. Hal terdekat yang saya sadari adalah sesuatu yang melakukan operasi terbalik: jpegtran memiliki fungsi memotong yang tanpa kehilangan memotong bagian tepi gambar .² Ia melakukannya dengan membuang MCU yang terpotong di sepanjang tepi gambar, meninggalkan yang bagian tengah tidak tersentuh.

Solusi siap pakai yang paling sederhana yang saya ketahui adalah plugin Better JPEG Lossless Resave untuk Photoshop. Ini menggunakan teknik yang didasarkan pada ide-ide yang diberikan di atas untuk menyalin MCU dari gambar asli di mana pun ia bisa, untuk menghindari menciptakan kembali mereka dari versi yang tidak terkompresi, seperti yang biasanya dilakukan Photoshop.


Digesti:

  1. Anda mungkin berpikir bahwa batas yang dihasilkan tidak akan terlalu putih , karena hilangnya JPEG akan menciptakan semacam perbedaan warna pada output. Saya melakukan beberapa pengujian, dan setidaknya di Photoshop, gambar yang benar-benar putih yang disimpan melalui Save For Web's JPEG level 10 (yaitu kualitas "rendah") menghasilkan gambar yang di-decode yang masih murni putih.

    Saya menentukan ini dengan dua tes:

    Pertama, saya memuat JPEG sebagai lapisan di atas yang asli, mengatur mode campuran lapisan atas ke Perbedaan, kemudian menambahkan lapisan penyesuaian Levels di atasnya untuk mencoba dan memperbesar perbedaan. Gambar yang dihasilkan tetap hitam, menunjukkan "tidak ada perbedaan."

    Kedua, ketika saya gagal melihat perbedaan yang diharapkan, saya menjatuhkan lapisan penyesuaian dan mengembalikan lapisan JPEG ke mode campuran Normal, mengambil alat pipet, dan mencari di seluruh gambar untuk piksel yang tidak ditampilkan sebagai RGB (255.255.255 ) di panel Info. Saya tidak pernah menemukannya. Saya berharap melihat angka-angka berkedip sedikit ketika saya menggosok gambar, tetapi mereka tetap stabil.

    Saya hanya dapat menyimpulkan bahwa ini adalah kasus yang merosot dari algoritma pengkodean: blok putih murni tetap putih melalui transformasi cosinus diskrit .

    Menariknya, ini tidak terjadi dengan blok hitam murni. Setidaknya dengan implementasi Photoshop, mereka berubah menjadi RGB (1,1,1) ketika diterjemahkan, bukan RGB (0,0,0).

    Intinya, Anda tidak perlu khawatir tentang titik-titik tergagap di daerah perbatasan ini saat mencetak gambar yang dihasilkan menggunakan teknik di atas.

  2. jpegtranadalah program baris perintah, tetapi ada juga program Windows GUI berdasarkan kode yang sama disebut jpegcrop.

  3. Sayangnya, plugin ini hanya untuk Windows.

Warren Young
sumber
1
Saya telah menggunakan program yang disebut JPEG Wizard yang menyediakan fungsi seperti itu. Itu juga memiliki kemampuan yang sangat bagus untuk menerapkan rasio kompresi yang berbeda untuk bagian JPEG yang berbeda. Dengan demikian, seseorang dapat menggunakan pengaturan kualitas tinggi untuk kepala dan tangan seseorang, kualitas sedang untuk pakaian mereka, dan kualitas lebih rendah untuk latar belakang, dan dengan demikian berakhir dengan file yang lebih kecil tetapi kualitas keseluruhan yang lebih baik daripada jika seseorang telah menggunakan kualitas menengah untuk semuanya.
supercat
1
Saya tidak mendapatkan kesempatan untuk mencobanya, tetapi posting blog ini menunjukkan bahwa jpegtranfungsi krop sebenarnya juga dapat digunakan untuk memperpanjang. (Namun, tidak yakin apa warna perbatasan yang diperluas itu.)
mattdm
4
@mattdm: Ya, jpegtranjuga dapat memperluas gambar, tetapi selalu cocok dengan abu-abu tengah yang dikodekan dengan keras, RGB (128.128.128). Itu karena hanya itu satu-satunya pilihan mudah, karena di ruang koefisien DCT, Anda dapat melakukannya dengan bzero()panggilan sederhana . Saya mencoba hack liar untuk mengubah ini , yang tidak berhasil, tetapi harus memberi Anda rasa keburukan yang terlibat. mengangkat tangan dengan frustrasi
Warren Young
@ WarrenYoung: Untuk mengubah warna blok padding, Anda mungkin perlu mengubah hanya koefisien (DC) pertama, dan membiarkan yang lain nol. Tentu saja, koefisien dikompresi, jadi ... bagaimanapun, itu harus bisa dilakukan, tetapi saya setuju bahwa itu tidak sepele seperti yang terlihat.
Ilmari Karonen
2
Mengenai poin terakhir Anda - jumlah penghematan terbesar berasal dari membuang informasi frekuensi tinggi. Keuntungan dari membuang presisi pada warna blok pixel padat tidak bisa lebih dari satu atau dua byte, jadi itu tidak pernah atau hampir tidak pernah dilakukan. Jika ada kehilangan informasi, itu ada dalam konversi YUV <-> RGB colorspace.
hobbs
20

Poin yang perlu diingat di sini adalah bahwa Anda kehilangan kualitas saat menyimpan foto ke dalam format kompresi yang hilang . Selama Anda menyimpan foto dalam format lossless (PSD, TIFF, dll) setelah menambahkan perbatasan, Anda tidak akan kehilangan lebih banyak data daripada yang telah hilang dengan menyimpan foto sebagai JPEG di tempat pertama.

Philip Kendall
sumber
1
Terima kasih. Dan ini benar bahkan ketika menggunakan program 'jelek' seperti Paint, saat menyimpannya ke misalnya TIFF?
LBogaardt
4
Setidaknya menurut pengujian cepat saya, Paint menggunakan algoritma kompresi LZW lossless saat menyimpan TIFF sehingga terlihat OK.
Philip Kendall
5
Perlu diingat bahwa ini kemungkinan akan secara signifikan meningkatkan ukuran gambar ...
BlueRaja - Danny Pflughoeft
2
cat juga mendukung PNG, yang juga merupakan format lossless
phuclv
+1 untuk ini karena jawaban yang membahas tentang menyimpan kembali ke jpeg tidak kompatibel dengan semua opsi penyandian jpeg.
James Snell
6

Ini tidak terlalu lossless, tetapi Anda bisa cukup dekat menggunakan GIMP (atau editor lain dengan fitur serupa) dan dua trik berikut:

  1. Pertama, pastikan batas yang Anda tambahkan memiliki kelipatan 8 piksel (dan lebih disukai kelipatan 16 piksel).

    Ini penting karena algoritma kompresi JPEG memecah gambar menjadi blok 8 × 8 piksel *, mulai dari sudut kiri atas, dan menerapkan algoritma kompresi lossy secara independen untuk setiap blok. Dengan demikian, setidaknya pada prinsipnya, Anda dapat membuat gambar JPEG tanpa kehilangan dengan menambahkan blok 8 × 8 piksel penuh di sekitar yang sudah ada. Namun, jika Anda mencoba menambahkan batas yang tidak terlalu lebar, blok-blok di gambar yang empuk tidak akan sejajar dengan yang ada di aslinya, dan beberapa kehilangan kompresi tidak bisa dihindari.

    *) Sebenarnya, sebagian besar gambar JPEG menggunakan subsampling kroma , yang berarti bahwa hanya bagian skala abu-abu dari gambar tersebut yang dikompres dalam 8 × 8 blok, sedangkan saluran chroma diperkecil 50% sebelum kompresi, menjadikan ukuran blok efektifnya 16 × 16 piksel. Jadi, untuk hasil terbaik, lebar perbatasan Anda harus benar-benar kelipatan 16 piksel. Namun, Anda biasanya dapat pergi dengan batas piksel 8 (atau 24 atau 40 dll), karena sedikit kehilangan kompresi di kroma tidak terlalu terlihat.

  2. Bagian kedua dari trik ini adalah, ketika menyimpan gambar akhir, untuk memilih kotak centang "Gunakan pengaturan kualitas dari gambar asli" di dialog Ekspor Gambar sebagai JPEG (di bawah Pengaturan lanjutan). Lakukan ini bahkan jika sepertinya akan menghasilkan kualitas yang lebih rendah daripada biasanya Anda gunakan!

    Pengaturan ini membuat GIMP menggunakan kembali pengaturan kompresi yang sama persis seperti yang digunakan untuk gambar asli, yang biasanya menghilangkan sekitar 99% dari kehilangan kompresi, asalkan Anda belum mengedit gambar terlalu banyak, dan khususnya, bahwa blok di gambar baru masih sejajar dengan yang asli. (Kadang-kadang masih ada beberapa kerugian karena kesalahan pembulatan, tetapi jauh lebih sedikit daripada yang akan terjadi.)


Sebagai demonstrasi cepat, saya mengambil gambar uji JPEG ini dari Wikimedia Commons , yang awalnya disimpan dengan pengaturan kualitas 50 yang cukup rendah, dan menambahkan perbatasan hitam-putih 8px (dan) hitam putih dengan menggunakan metode yang dijelaskan di atas:

Uji gambar dengan batas 8px, sebagian besar lossless

Inilah perbedaan antara yang asli (15.1 kB) dan gambar yang diedit (16.7 kB), ditampilkan dengan menggunakan mode layer "Grain extract" GIMP:

Perbedaan antara gambar empuk dan asli

Anda dapat melihat beberapa kesalahan kroma yang sangat kecil, yang disebabkan oleh lebar perbatasan tidak kelipatan 16, dan (jika Anda perhatikan dengan cermat) beberapa blok di mana ada juga kerugian kecil di saluran luma karena pembulatan. Namun, secara visual, gambar asli dan gambar empuk semuanya tidak dapat dibedakan, bahkan pada pembesaran 2x dan membalik secara bergantian di antara mereka.

Secara khusus, kontras ini dengan hasil menabrak kualitas JPEG sampai 50-60 sebelum menyimpan gambar empuk, yang menghasilkan gambar berikut 17,6 kB:

Uji gambar dengan batas 8px, kualitas ditingkatkan dari 50 hingga 60

Pada perbesaran tinggi, Anda pasti dapat melihat bahwa gambar yang diedit terasa lebih kabur di beberapa tempat daripada yang asli, dan mengambil perbedaan dengan ekstrak Grain menegaskan ini:

Perbedaan antara gambar empuk (pada Q60) dan asli

Ilmari Karonen
sumber
"memilih kotak centang ini tampaknya tidak mempengaruhi pengaturan" Progresif "." Bukan bug, karena penyandian progresif adalah pengaturan penyandian, bukan pengaturan kualitas. Jpegtran dapat mengkonversi gambar ke dan dari progresif tanpa kehilangan.
Damian Yerrick
@tepples: Anda benar; Saya telah menghapus paragraf itu. Untuk beberapa alasan, saya mendapat kesan bahwa beralih mode progresif akan menyebabkan pengaturan kualitas tidak cocok, tetapi tes cepat tampaknya mengkonfirmasi bahwa saya salah tentang itu.
Ilmari Karonen
1
@thomasrutter: Saya tidak bisa menghapus komentar, jadi saya hanya akan mengarahkan Anda ke posting forum asli yang menjelaskan fitur tersebut , dan khususnya, kutipan ini: " Jika Anda hanya membuat beberapa perubahan pada gambar, maka ulangi menggunakan tabel kuantisasi yang sama akan memberikan Anda kualitas dan ukuran file yang hampir sama dengan gambar aslinya. Ini akan meminimalkan kerugian yang disebabkan oleh langkah kuantisasi, dibandingkan dengan apa yang akan terjadi jika Anda menggunakan tabel kuantisasi yang berbeda. "
Ilmari Karonen
1
Sebagai perbandingan, berikut ini contoh lain dalam menjawab pertanyaan yang berbeda. Pemahaman saya dalam teori setuju dengan Ilmari, tetapi setidaknya dalam contoh saya, praktiknya tampaknya jauh lebih banyak dengan apa yang dikatakan Thomas - setidaknya ketika memulai dengan gambar yang sangat terdegradasi. (Saya pikir batu nisan membuat contoh yang buruk untuk tujuan ini, karena hilangnya detail pada batu kurang jelas daripada pada kulit manusia.)
mattdm
1
@mattdm: Tampaknya sangat tergantung pada perangkat lunak; Saya mencoba mereproduksi hasil Anda dari jawaban itu di GIMP, dan sepertinya GIMP (v2.8.10, setidaknya) cukup sedikit lebih baik dalam menjaga kualitas JPEG daripada ImageMagick (versi apa pun yang Anda uji). Gambar pertama Anda, disimpan sekali pada q75, memiliki PSNR 34,0298, sedangkan yang disimpan dua kali pada q75 hanya memiliki satu dari 32,8169 (dan yang resaving 8 kali memiliki PSNR sebesar 32,6459). Sebagai perbandingan, menyimpan gambar sumber yang sama sekali di GIMP pada q75 memberikan PSNR 36,4560; membuka dan menyimpannya kembali dengan kualitas yang sama hanya menjatuhkan sedikit, ke 36,3295.
Ilmari Karonen
3

Maaf jika ini bukan yang Anda inginkan tetapi ...

Sepertinya Anda menambahkan batas putih sebagai bantuan untuk memposisikan gambar Anda saat mencetak. Mengapa tidak fokus mempelajari antarmuka pencetakan dengan benar dan menghindari peretasan cerdik seperti ini? Masalah lain yang muncul adalah Anda mengizinkan program pencetakan untuk mengubah ukuran gambar 4680x3120 Anda agar sesuai dengan DPI / resolusi yang benar. Ini mungkin memiliki efek yang lebih parah daripada menyimpan ulang jpeg.

aaaaargZombies
sumber
Kedua poin valid, terima kasih. Namun, saya mengunggah foto saya ke salah satu toko cetak online, jadi saya tidak memiliki kendali atas printer yang sebenarnya.
LBogaardt
1

Jawaban sebelumnya sangat bagus.

Saya hanya akan menambahkan beberapa "aspek psikologis" dari format jpg.

Jika jpg dipersiapkan dengan baik, itu hanya kehilangan sekitar 0,5% informasi. Dalam sebagian besar kasus, sesuatu yang tidak bisa dilihat mata manusia. Anda memerlukan program untuk melakukan beberapa analisis dan melihat perbedaannya (seperti analisis yang baru saja dilakukan Ilmari).

"Kualitas Baik" adalah suatu proses, tidak hanya cara format file menyimpan gambar. Ya, Anda mengkompres ulang file dengan jpg sekali lagi karena Anda benar - benar membutuhkannya. Jika berada dalam situasi yang terkendali, boleh saja melakukannya.

Anda benar - benar membutuhkannya berarti Anda tidak dapat menggunakan format lossless lain, Anda memiliki kebutuhan penyimpanan atau perangkat lunak yang sangat spesifik, atau alur kerja yang sangat ketat.

Jika Anda benar-benar khawatir tentang kualitasnya, mungkin Anda tidak akan menggunakan Paint. Format JPG memiliki beberapa konfigurasi yang tidak dapat Anda kontrol di Paint sama sekali.

Berikut adalah daftar program gratis saya di mana Anda benar-benar dapat mengontrol kompresi jpg, dan opsi yang perlu Anda pilih. (Semua dari mereka dalam dialog simpan jpg)

Irfanview - Aktifkan Nonaktifkan subsampling warna chroma.

FastStone Image Viewer - Subsampling warna: Tidak ada.

Gimp - Subsampling 4: 4: 4

Kesimpulan. Jangan gunakan Paint.

Satu hal yang belum saya periksa. Jika semua program ini mempertahankan profil warna tertanam. Saya akan mengedit posting saya nanti.

Rafael
sumber
Seseorang memberi suara -1 pada jawaban ini. Biasanya aku tidak peduli karena aku tahu aku bisa mengatakan sesuatu yang bodoh. Dalam kasus khusus ini, bagian mana dari jawaban yang salah?
Rafael
Saya tidak memilih (naik atau turun), tetapi Anda mungkin ingin mengerjakan ejaan dan tata bahasa Anda untuk memberikan kesan pertama yang lebih baik (dan juga, jujur, untuk membuat jawaban Anda lebih mudah dibaca). Juga, pertanyaan ini sudah memiliki beberapa jawaban (dan pertanyaan saya, terutama, ternyata cukup lama); pada titik tertentu, beberapa orang mungkin mulai menurunkan voting (atau setidaknya tidak mengotot) jawaban yang tidak jelas menambahkan sesuatu yang baru ke yang sudah ada. Juga, cobalah menyusun jawaban Anda sehingga bagian-bagian penting terlihat sekilas; dalam hal ini, satu-satunya bagian yang Anda soroti dengan huruf tebal adalah catatan kaki yang tidak penting.
Ilmari Karonen
Terima kasih atas komentar Anda Ilmari. Saya berusaha untuk berpikir dalam bahasa Inggris, karena itu bukan bahasa ibu saya. Saya akan mencari alat pengejaan. Saya tidak yakin apakah ada tata bahasa. - Untuk bagian kedua dari komentar, saya mengerti bahwa logika di balik StackExchange adalah menjawab pertanyaan secara independen, karena aliran jawaban tidak diperbaiki, karena mereka dapat mengubah urutan atau diedit. Saya akan melihatnya. (Saya menghapus teks tebal) Terima kasih lagi. : o)
Rafael
1
"itu hanya kehilangan sekitar 0,5% informasi" [rujukan?] :)
Warren Young
Hei Warren, ini dia: otake.com.mx/Apuntes/PruebasDeCompresion2/… Ini dalam bahasa Spanyol, silakan gunakan google translate untuk saat ini, dan saya perlu memperbaruinya. Bahkan kurang dari 0,392% :)
Rafael
0

IrfanView bekerja dengan baik untuk saya untuk set gambar. Berikut adalah beberapa cara

Ini adalah prosedur tersimpan saya untuk penyisipan perbatasan - Prosedur Infran untuk menambahkan perbatasan

  1. Klik kanan gambar, 'Buka dengan' -> 'InfranView'
  2. Tekan 'b'
  3. Centang 'Gunakan opsi lanjutan' di kiri atas, tekan 'Lanjutan'
  4. Periksa 'Ukuran Kanvas', tekan 'Pengaturan'
  5. Masukkan setiap lebar batas (Sisi kiri, Sisi kanan, Sisi atas, Sisi bawah)
  6. Tekan OK'
  7. Pilih 'Timpa file yang ada'
  8. Tekan OK'
  9. Masukkan direktori keluaran 'Direktori keluaran untuk file hasil:'
  10. Arahkan ke dan klik dua kali gambar untuk menambahkan perbatasan di daftar atas. Ini menambahkannya ke daftar 'file masukan:' di daftar bawah
  11. Tekan 'Mulai Batch'
J-Dizzle
sumber
1
Bisakah Anda menjelaskan apa yang istimewa tentang metode itu sehingga memenuhi persyaratan poster untuk tidak menurunkan kualitas gambar? Pada bacaan pertama, ini tampaknya akan mengirim JPEG melalui seluruh siklus dekompresi-recompress yang berusaha dihindari oleh poster.
Philip Kendall
hmmm, Anda membawa poin menarik sehubungan dengan siklus hidup gambar melalui proses yang saya daftarkan di sini, saya tidak berpikir ke arah itu. Anda mungkin benar, jika Anda ingin saya menghapus atau mengubah posting saya, silakan beri tahu saya :)!
J-Dizzle