Görsel dışa aktarırken şu JPEG kalite kaydırıcısını hâlâ yüzde olarak mı kullanıyorsun? 80'e çektiğinde içinden "görüntü kalitesinin yüzde sekseni kurtarıldı" diye geçiriyorsun; 100'e çektiğinde "işte şimdi hiçbir şey kaybolmadı" sanıyorsun.
Bu anlayışı tümüyle yıkmak gerekiyor: kaydırıcıdaki sayının "kalitenin yüzde kaçı" olduğuyla hiçbir ilgisi yok; kalite 100 de kayıpsız değildir. Hemen uygulanabilir sonuçları şuraya koyalım—fotoğrafları güvenle saklamak istiyorsan 85–92'ye ayarla; web'e ve sosyal medyaya göndereceksen 75–82 yeter; 100'ü varsayılan yapma, yalnızca dosya boyutunu ikiye, hatta üçe katlar, görüntü kalitesine hiçbir şey katmaz. Şimdi bu kaydırıcıyı basit bir dille parçalayalım.
Tek cümleyle açıklamak gerekirse: JPEG kalite kaydırıcısı "görüntü kalitesinin ne kadarının korunacağını" değil, niceleme tablosundaki bölen grubunun ne kadar acımasız olduğunu kontrol eder—bölen ne kadar büyükse, yuvarlama o kadar sert, kayıp o kadar fazladır. Görüntü kalitesiyle ve dosya boyutuyla doğrusal bir ilişkisi yoktur; 100'den 90'a gitmekle 20'den 10'a gitmek aynı şey değildir.
Önce şu öncülü koyalım: JPEG kayıplı bir formattır; kaydet tuşuna bastığın andan itibaren veri kaybeder, kaydırıcı yalnızca "ne kadar sert kaybedileceğini" belirler, "kaybedilip kaybedilmeyeceğini" değil. Kayıp yönteminin sabit bir akışı vardır; kaydırıcı bu hattın son kapısıdır.
Kaydetme sırasında görüntü önce RGB'den YCbCr'ye dönüştürülür; parlaklık ve renk iki ayrı kanala ayrılır. Bunun nedeni insan gözünün parlaklığı renkten çok daha iyi görmesidir; önce ayırırsan, sonra parlaklığı öncelikli korumak kolaylaşır.
Ardından tüm görüntü 8×8 piksellik küçük bloklara bölünür ve her blokta bir Ayrık Kosinüs Dönüşümü (DCT) yapılır; piksel renkleri bir dizi frekans değerine çevrilir. Bunu bir akoru tek notalara ayırmaya benzetebilirsin: düşük frekanslar görüntünün zemin rengi ve geçişleridir, yüksek frekanslar keskin kenarlar ve ince dokulardır. Bu akışın tam sürümünü Wikipedia'nın JPEG maddesi oldukça kapsamlı anlatır.
Asıl öldürücü darbe son adımdadır: her frekans değeri niceleme tablosundaki (Quantization Table) bir sayıya bölünür ve sonra en yakın tam sayıya yuvarlanır. Yuvarlama, bilginin kalıcı olarak öldüğü yerdir—tam bölünmeyen artık doğrudan atılır ve geri gelmez. Kalite kaydırıcısının yönettiği şey bu bölenlerin ne kadar sert olduğudur: kaydırıcı değeri yüksekse bölen küçüktür, yuvarlama neredeyse veriye zarar vermez; kaydırıcı değeri düşükse bölen büyüktür, yuvarlama ayrıntıları doğrudan siler. Yüksek frekans bileşenlerinin bölenleri daha hızlı büyür, bu yüzden her seferinde önce feda edilen şey kenarlar ve ince dokulardır.
Bu yüzden yüzde olamaz. 100'den 90'a çekmekle 20'den 10'a çekmek arasındaki bölen değişimi tamamen farklıdır; görüntü kalitesi ve dosya boyutundaki düşüş de tamamen farklıdır—90 civarında bir kademe oynatınca hiçbir şey hissetmeyebilirsin; 20 civarında bir kademe oynatınca görüntü mahvolur. Bunu yüzde olarak anlamak, bu kontrol hakkındaki en yaygın ve en maliyetli yanlış anlamadır.
Önce cevabı verelim: 100'ün kayıpsız olmasına iki sert engel var; biri kaydırıcıya bakmaz, diğerini kaydırıcı bile kurtaramaz.
Birincisi kroma alt örneklemedir (chroma subsampling). RGB'den YCbCr'ye dönüşümden sonra, sıkıştırma gerçekten başlamadan önce çoğu kodlayıcı kroma ayrıntısının yaklaşık %75'ini atar; nedeni yine aynıdır: insan gözü renge karşı duyarsızdır, atılsa da fark edilmez. Bu adım kaydırıcıya hiç bağlı değildir; 100'e ayarlasan da aynen uygulanır.
İkincisi matematiğin kendisi temiz değildir. Niceleme tablosundaki bölenler en küçüğe ayarlansa bile, "pikselden frekansa, frekanstan tekrar piksele" gidiş-dönüşte küçük yuvarlama hataları kalır. Kaydedilen dosya açıldığında artık kaydet tuşuna bastığın andaki pikseller değildir.
Gerçekten bir bit bile kaybetmemek istiyorsan kayıpsız rotayı seç: PNG, TIFF veya WebP'nin kayıpsız sürümü. Kayıplı sıkıştırma tek yönlü bir yoldur; JPEG'in her kademesi böyledir, o "mükemmel" görünen 100 dahil.
Çok sayıda gerçek test ve piksel düzeyinde karşılaştırma sonunda çok net bir ayrımda birleşiyor: neredeyse tüm senaryoları kapsayan iki aralık.
85–92 saklama ayarıdır. Portfolyolar, müşteriye teslim edilecek işler, dokunmaya kıyamadığın orijinal fotoğraflar bu ayara girer. Kalite 90 ile kaydedilen dosya, sıkıştırılmamış hâlinin yaklaşık 1/8 ila 1/12'si kadardır ve fark gözle görülmez—%400'e büyütüp belirli bir küçük bölgeye bakman gerekir ki değişimi seçebilesin.
75–82 web ayarıdır. Web sitesi görselleri, sosyal medya yüklemeleri bu ayara girer. Dosya, saklama ayarına göre %40–%60 daha da küçülür; bedeli esas olarak karmaşık dokularda hafif yumuşamadır, normal görüntülemede neredeyse fark edilmez.
Bir önceki "Kayıplı ve Kayıpsız" yazısını okuduysan, orada verilen 80–85 tatlı noktası bu iki aralıkla çelişmez: 80 civarı zaten web ayarının içindedir, 85 ise tam saklama ayarına adım atar; 80–85 ile kaydedilmiş görüntüleri yeniden sıkıştırmaya gerek yoktur.
Üç kademeyi tek cümlede toplarsak: saklayacağın şeyler 85–92'ye, göndereceğin şeyler 75–82'ye; 60 ve altı mayın tarlasıdır, uzak dur.
Dışa aktarırken varsayılanı 100'e çekmek kaygıdır, strateji değil. Kalite 85 dosyası, kalite 100'den %60–%75 daha küçüktür, ama görüntü kalitesinde hiçbir fark görülmez; web için bu, yükleme süresini boşuna uzatmak demektir—web görsellerinin bu hesabını "Web görsellerini hızlandırma" yazısında ayrıntılı olarak yaptım.
Kaydırıcı 60'ın altına indiğinde, görüntü kalitesindeki düşüş bir yamaç değil, bir uçurumdur.
Nedeni yine yuvarlamadır. Değer çok düşük olduğunda, yüksek frekans bileşenlerinin bölenleri inanılmaz büyür; bir frekans değeri bölünüp yuvarlandığında doğrudan sıfıra gider—bu ayrıntı hiç kaydedilmemiş olur. Böylece bütün bir görsel bilgi sınıfı toplu hâlde kaybolur: saç telleri, kumaş dokuları, serifli yazı tiplerinin harf uçları, ilk yok olanlardır.
Geriye kalan görüntü standart JPEG artefaktlarıdır: 8×8'lik bloklar hâlinde alanlar, geçişlerde halka halka renk bantları, keskin kenarların yanında tüylenme ve sivrisinek gürültüsü (mosquito noise). Büyük şekiller hâlâ vardır, ama bu görüntü artık "insanın bakması için" sayılmaz. Her artefakt tipinin nasıl oluştuğunu ayrı bir yazıda resimli olarak anlattım.
Bu yüzden sonucum şu: 60, normal görüntüler için pratik alt sınırdır. Altına inmekle tasarruf edilen birkaç KB, bir bakışta sahte görünen bir sonuç getirir; buna değmez.
"Kalite 90" evrensel bir para birimi değildir. JPEG spesifikasyonu önerilen bir niceleme tablosu seti verir (Annex K), ama her yazılımın hangi tabloyu kullandığı ve nasıl ölçeklediği kendi kararıdır. Aynı "yüksek kalite" için dört yaygın aracın verdiği sayılar tamamen farklıdır: Photoshop'un ölçeği 0–12'dir; onun 10'u kabaca referans uygulama libjpeg'in 90'ına denktir; GIMP ve ImageMagick 1–100 ölçeğini kullanır; GIMP'in "yüksek kalite" ayarı 85, ImageMagick'inki 92'dir; libjpeg referans uygulama olarak kendi referans değeri 90'dır.
İki araç da "kalite 85"e ayarlansa bile dışa aktarılan dosyalar aynı olmaz. Bu yüzden bir yazılımda bir sayıyı ezberleyip başka bir yazılıma aynen taşıma. Yazılımlar ve projeler arası karşılaştırmada güvenilir iki yol vardır: gerçek çıktı boyutuna bak, gerçek görüntü sonucuna bak.
Kaydırıcıya güvenilmez, göz ise ekrandan ve durumdan etkilenir; "fark görülmüyor" ifadesi ölçülebilir mi? Evet, çok daha güvenilir bir yol başka bir ölçüye geçmektir: Yapısal Benzerlik İndeksi (SSIM, Structural Similarity Index Measure).
Pikselleri tek tek karşılaştırmaz; yapı, parlaklık ve kontrast olmak üzere üç şeyin ne kadar değiştiğine bakar; "kaç piksel farklı" diye saymaktan insan gözünün görüntü değerlendirme biçimine daha yakındır. Puan 0 ile 1 arasındadır; 1, iki görüntünün tamamen aynı olduğu anlamına gelir. Formülü ve arka planı Wikipedia'nın SSIM maddesinde açıkça anlatılır.
Yaygın kalite kademelerine karşılık SSIM kabaca şu düzeydedir: kalite 85 dosyaları genellikle 0,97'den büyük puan alır ve orijinalden görsel olarak ayırt edilemez; 60'a düşünce puan 0,90–0,93 aralığına iner, hafif yumuşama başlar, ancak büyütünce görülür; 40'a gelince yalnızca 0,82–0,87 kalır, artefaktlar artık çıplak gözle görülür.
Bu sayılar kaydırıcıdan çok daha dürüsttür. Kaliteyi tahminle belirlemek istemiyorsan, ImageMagick'in compare komutuyla iki görüntünün SSIM'ini doğrudan hesaplayabilir ve "dosya boyutunu en çok küçültürken 0,85'lik algı eşiğinin altına düşmeyen" noktayı bulabilirsin. Bu ölçünün kullanımını ayrı bir SSIM derinlemesine anlatım yazısında ele aldım.
Aşağıdaki küçük araç tamamen tarayıcıda çalışır, görseller hiçbir yere gönderilmez. Bir görsel seçin (veya "Örnek görseli dene"ye basın) ve kaydırıcıyı oynatın; sıkıştırma sonrası boyutu ve SSIM değişimini izleyin. SSIM ≥ 0,85 koşuluyla en küçük boyutu bulan otomatik aramayı da kullanabilirsiniz. SSIM değeri, yeni sıkıştırılan görüntü için gerçek zamanlı hesaplanır. İşte önceki bölümdeki ölçü bu.
Not: tarayıcıdaki yerleşik JPEG kodlayıcı kroma alt örnekleme parametrelerini ve niceleme tablolarını göstermez. Bu araç, kaydırıcının gerçek etkisini gösterir ve farkı SSIM ile nicelleştirir; kodlayıcının iç ayarlarını değiştirmeye izin vermez. Ayrıca makalenin tezini doğrular: kalite 100 kayıpsız değildir ve aynı sayı farklı yazılımlarda farklı anlama gelir.
Çoğu durumda 80 civarı yeterlidir; 100 varsayılan olmamalıdır. Kalite 85 dosyası, kalite 100'den %60–%75 daha küçüktür ama gözle hiçbir fark görülmez; fotoğraflar güvende olsun istiyorsan 85–92, web ve sosyal medya için 75–82 yeterlidir; 60'ın altı belirgin artefaktlar üretir.
Hayır. 100'e kadar çekilse bile JPEG genellikle önce kroma alt örneklemede renk ayrıntısının yaklaşık %75'ini kaybeder, ardından niceleme ve yuvarlama geri döndürülemez kayıplara yol açar. Kayıpsız istiyorsan PNG, TIFF veya kayıpsız WebP kullan.
Photoshop'un JPEG kalite ölçeği 0–12'dir, 1–100 değil; onun 10'u kabaca referans uygulama libjpeg'in 90'ına denktir. Her yazılımın aynı sayıyı eşlemesi farklıdır; yazılımlar arasında sayıları aynen taşıma, gerçek çıktı boyutunu ve görüntü sonucunu temel al.
Orijinalle büyütüp karşılaştırmak en doğrudan yoldur; objektif bir ölçüt istiyorsan SSIM kullan. Kalite 85 JPEG genellikle SSIM'de 0,97'nin üzerindedir ve orijinalden görsel olarak ayırt edilemez; 40 civarında 0,82–0,87'ye düşer, artefaktlar çıplak gözle görülür. ImageMagick'in compare komutu bu puanı doğrudan hesaplayabilir.
Kaydırıcıdaki o sayı bir bölme parametresidir, görüntü kalitesi yüzdesi değil; 100 kayıpsız değildir, 60'ın altı uçurumdur. Tek bir slogan gerekirse: Fotoğrafları 85 olarak sakla, web'e göndereceklerini 80 olarak kaydet, 100'ü hiçbir yerde kullanma—dosya iki katına çıkar, görüntü kalitesi bir gram artmaz.
Format seçiminden boyut değiştirmeye, oradan kalite ayarına ve web hızlandırmaya kadar tüm zinciri görmek istiyorsan, "Görsel Sıkıştırma Tam Rehberi"ne bak; bütün zincir o yazıda.