Devam ettim ve neler olup bittiğini çözüp çözemeyeceğimi görmek için deneyi tekrarladım.
prosedür
Varsayılan ayarları kullanarak (aşağıda gösterilen) GIMP'deki (Filtreler> İşleyici> Bulutlar> Katı Gürültü ...) "Katı Gürültü" filtresini kullanarak rastgele 256 x 256 piksel RGB görüntü oluşturdum:
Ve sonuç:
Sonra varsayılan ayarları kullanarak görüntüyü JPEG olarak kaydettim:
Sonra görüntüyü Windows'a aktardım ve görüntüyü Dosya Gezgini'ndeki görüntüye sağ tıklayıp menüden Önizleme'yi seçerek Windows Fotoğraf Görüntüleyicisi ile açtım . Daha sonra alttaki düğmeleri kullanarak görüntüyü döndürdüm ve ok tuşlarını kullanarak bir sonraki görüntüye giderek görüntüyü kaydettim.
Aşağıdaki testlerin her biri için orijinal görüntünün bir kopyasıyla başladım ve kaydetmeden önce karşılık gelen sayıda döndürdüm (döndür düğmesine tıklayın). İşte reslting boyutları ( ls -l -r
):
size in bytes last-modified date
VVVVV VVVVV
-rwxrwx--- 1 root vboxsf 6258 Nov 8 11:24 original.jpg
-rwxrwx--- 1 root vboxsf 23645 Nov 8 11:30 cw.jpg
-rwxrwx--- 1 root vboxsf 23636 Nov 8 11:30 cw-cw.jpg
-rwxrwx--- 1 root vboxsf 23649 Nov 8 11:30 cw-cw-cw.jpg
-rwxrwx--- 1 root vboxsf 6258 Nov 8 11:27 cw-cw-cw-cw.jpg
-rwxrwx--- 1 root vboxsf 23649 Nov 8 11:31 cw-cw-cw-cw-cw.jpg
-rwxrwx--- 1 root vboxsf 23649 Nov 8 11:29 ccw.jpg
-rwxrwx--- 1 root vboxsf 23636 Nov 8 11:29 ccw-ccw.jpg
-rwxrwx--- 1 root vboxsf 23645 Nov 8 11:29 ccw-ccw-ccw.jpg
-rwxrwx--- 1 root vboxsf 6258 Nov 8 11:27 ccw-ccw-ccw-ccw.jpg
-rwxrwx--- 1 root vboxsf 23649 Nov 8 11:30 ccw-ccw-ccw-ccw-ccw.jpg
Acil gözlemler
- Windows Fotoğraf Görüntüleyicisi (WPV) boyutu önemli ölçüde artırır; Bu testte artış miktarı yaklaşık dört kat!
- Tüm yeni görüntüler aynı boyutta artıyor, ancak aynı değiller.
- WPV, görüntüyü 360 derecelik bir kat ile döndürdüğünde yeniden kodlamaz veya yeniden kaydetmez. (Zaman damgası, 11:27, dosyaların ilk kopyalandığı zamandır.)
cmp -l
Aynı içeriğe sahip olması gereken dosyaları kullanmak , dosyaların farklı olduğunu görmemizi sağlar.
robert@unity ../jpeg-rotate-test % cmp -l cw.jpg ccw-ccw-ccw.jpg
2223 63 62
2224 60 71
2226 60 64
2227 60 66
robert@unity ../jpeg-rotate-test % cmp -l cw-cw.jpg ccw-ccw.jpg
2223 63 62
2224 60 71
2226 60 64
2227 62 64
robert@unity ..jpeg-rotate-test % cmp -l ccw.jpg cw-cw-cw.jpg
2223 62 63
2224 71 60
2226 64 60
2227 61 64
robert@unity ../jpeg-rotate-test % cmp -l cw.jpg cw-cw-cw-cw-cw.jpg
2221 60 61
2223 63 61
2224 60 66
2226 60 61
2227 60 61
robert@unity ../jpeg-rotate-test % cmp -l ccw.jpg ccw-ccw-ccw-ccw-ccw.jpg
2223 62 63
2224 71 60
2226 64 65
2227 61 64
Bu dosyalar yalnızca dört baytta (aslında bir zaman damgasında) farklılık gösterir, yani WPV her zaman aynı şeyi yapar; Şimdi sadece bunun ne olduğunu bulmamız gerekiyor.
Detaylı Gözlemler
Bunun için resimlerde tam olarak ne olduğunu görmek için JPEGsnoop kullandım .
Çıktılar oldukça uzun olduğu için onlara bir öz olarak bağladım . İşte farklılıkların bir özeti:
GIMP, meta veriler için yalnızca bir APP0
(JFIF) ve COM
(yorum) bölümü kullanır. WPV APP0
segmenti el değmeden bırakır , fakat merakla yoruma boş bir bayt ekler (böylece boş bırakılır).
WPV APP1
, Exif ve XMP meta verileri olan iki segment ekler . Bu segmentler sırasıyla 4286 ve 12726 bayttır. Birlikte, dosya boyutundaki neredeyse tüm artışı hesaba katarlar.
GIMP aşamalı bir JPEG, WPV ise temel (aşamalı olmayan) bir JPEG üretir. Bu nedenle GIMP'nin görüntüsünde birden fazla tarama parçası varken, WPV görüntüsünde yalnızca bir tane vardır. Tecrübelerime göre, ilerici görüntü bazen biraz daha küçüktür.
GIMP 1 × 1 kroma alt örneklemesini, WPV ise 2 × 2 alt örneklemesini kullandı. Bu, WPV'nin "gerçek" kayıpsız döndürme kullanmadığına, bunun bir şekilde siyah beyaz bir görüntü olduğunu tespit edemediğine inanmamı sağlıyor.
Bu sorunları çözmek için ikinci bir test yaptım.
prosedür
İlk testte benzer adımları izledim. Aşağıdaki ayarlarla RGB Gürültü filtresini (Filtreler> Burun> RGB Burun ...) kullanarak rastgele 256 × 256 RGB görüntü oluşturdum:
İşte sonuç:
Aşağıdaki ayarları kullanarak dosyayı JPEG olarak verdim:
Aşamalı kapatıldı, ancak Alt Örnekleme hala 4: 4: 4 olarak ayarlandı (bu, 1 × 1 alt örneklemenin başka bir adıdır). Kalite 98'e yükseldi.
Görüntüyü kopyaladım ve kopyayı saat yönünde döndürdüm; daha sonra döndürülen sürümü kopyaladı ve bu kopya saat yönünün tersine döndürüldü, böylece orijinal ve WPV işlenmiş kopyası arasındaki kaliteyi doğrudan karşılaştırabiliriz.
Sonuçlar
-rwxrwx--- 1 root vboxsf 159774 Nov 8 16:21 original-random.jpg
-rwxrwx--- 1 root vboxsf 222404 Nov 8 16:24 cw-random.jpg
-rwxrwx--- 1 root vboxsf 222467 Nov 8 16:24 cw-ccw-random.jpg
Bu zamandaki artış göreceli olarak daha küçük olmasına rağmen (yaklaşık% 40), mutlak artış daha da büyüktür - yaklaşık 62 kB. Bu, WMV'nin daha az verimli bir kodlama kullandığını göstermektedir.
İki görüntüyü karşılaştırmak için ImageMagick kullanacağım :
robert@unity ../jpeg-rotate-test % compare -verbose -metric AE original-random.jpg cw-ccw-random.jpg null:
original-random.jpg JPEG 256x256 256x256+0+0 8-bit sRGB 160KB 0.000u 0:00.009
cw-ccw-random.jpg JPEG 256x256 256x256+0+0 8-bit sRGB 222KB 0.010u 0:00.010
Image: original-random.jpg
Channel distortion: AE
red: 0
green: 0
blue: 0
all: 0
original-random.jpg=> JPEG 256x256 256x256+0+0 8-bit sRGB 0.050u 0:00.020
Orijinal ve döndürülmüş kopya arasında sıfır piksel var . Dolayısıyla, WPV "gerçek" kayıpsız rotasyon kullanmasa bile, yeterince iyi bir iş yapıyor. Neler olduğunu bildiğimden şüpheleniyorum ve açıklamak için biraz JPEG formatının arkasındaki matematiğe yönlendireceğim.
JPEG sıkıştırma algoritması, bir görüntüyü 8 × 8 piksel bloklara böler. Bu blokların her biri daha sonra bir Ayrık Kosinüs Dönüşümüne (DCT) tabi tutulur . Elde edilen DCT katsayıları bloğu farklı frekans dalgalarının toplamı olarak tanımlar. Algoritma daha sonra gürültüye ve çok küçük detaya karşılık gelen yüksek frekanslı dalgalarda bazı bilgileri “atar”. Kod çözme işlemi DCT'yi tersine çevirir ve bloğu geri almak için depolanan dalgaları birleştirir.
DCT "dalgalarını", dönüşümü geri almadan ve tekrar yapmaksızın döndürmek mümkündür (temel olarak tüm yatay dalgaları dikey dalgalara ve tersi yönde çevirirsiniz). WPV'de olan şey, görüntünün aslında kodu çözüldüğü, döndürüldüğü ve sonra yeniden kodlandığı. Yeniden kodlama işlemi sırasında, resmimizin boyutu her iki boyutta da 8 katı olduğundan, yeni blokların her biri orijinal bloklardan birine karşılık gelir. Önemli olarak, her bloğun yüksek frekanslı bileşenleri olmadığından, algoritma herhangi bir bilgiyi atmaz ve "gerçek" kayıpsız bir rotasyonun sahip olacağı tam olarak doğru DCT bileşenlerini bulur.
Son olarak, JPEG dosyalarının bileşenlerine tekrar bakacağım. Sonuçlar tekrar gists olarak bağlanır . İkisini karşılaştırarak:
WPV görüntüsü, fazladan 4286 + 2 bayt Exif meta verisi, yorumda 1 ekstra bayt ve 12,726 + 2 bayt XMP meta verisi içerir. Bu, toplamda 17.017 bayt ek meta veridir. Tüm bu veriler ne için kullanılıyor? Güvenilir hex editörüm ve ilgili standartların bir kopyası ile dosyaya baktım:
Meta veri etiketleri numarasını içeren bir TIFF resim gibi yapılandırılmıştır Exif (orada bir yol daha karmaşık, ama doğru üzerinde atlamak gerekir). Exif segmentindeki baytların çoğu, etiket numarasına sahip EA1C
(59,932 ondalık) iki özdeş etikette bulunur . Bu etiket numarası bulabildiğim hiçbir yerde belgelenmemiş. Her iki etiket de ilk altı ( 1C EA 00 00 00 08
) hariç tümü boş bayt olan 2060 bayt "tanımsız" tür içerir . Bu etiketlerin ne olduğu, neden ikisi olduğu ve neden her birinin 2 kB olması gerektiği hakkında hiçbir fikrim yok.
XMP meta verileri aslında sadece WPV sürüm dizesini içeren (zaten Exif meta verilerindeydi) ad alanlı ve uzun UUID'lere sahip tümleşik bir XML belgesidir. Ancak, bu yalnızca yaklaşık 400 baytlık hesap oluşturur. Segmentin geri kalanı 100 alanın 122 tekrarı ve ardından yeni bir satır . Bu, 12,000 baytın üzerinde tamamen boşa harcanan alan.
Önceki test gibi, hem GIMP hem de WPV aynı DCT niceleme tablolarını kullanır. Bu, aynı DCT katsayılarını tam olarak hesaplamaları gerektiği ve dolayısıyla görüntülerin tamamen aynı olması gerektiği anlamına gelir. WPV'nin aynı kantitatif tabloları kullanıp kullanmadığını veya tabloları girdiden kopyalayıp kopyalamadığından emin değilim.
Önceki testten farklı olarak, bu kez WPV 1x1 alt örnekleme kullanır, bu nedenle bunun renkli bir görüntü olduğunu tespit ediyor olabilir (veya görüntüyü kayıpsız olarak yeniden kodlamak için en azından daha yüksek örneklerin gerekli olduğunu).
GIMP ve WPV farklı Huffman masaları kullanır (entropi kodlama adımının bir parçası). WPV için tablolar toplam 279 bayt daha büyüktür ve bir durumda 7 kat kadar kod içerir.
JPEGsnoop’un istatistiklerine bakıldığında, bu kodların bazılarının nadiren kullanıldığını görebiliriz. Örneğin, ID: 1, Class: AC
tabloda tanımlanmış 119 16 bit kodun yalnızca 23'ü kullanılıyor. Genel olarak, gerçek tarama segmenti WPV versiyonunda% 28,5 daha büyüktür.
özet
WPV "gerçek" kayıpsız rotasyonlar yapmıyor olabilir, ancak rotasyonlar pratik olarak kayıpsız gibi görünmektedir.
Ekstra büyüklük kısmen sabit miktarda ek meta veriden ve kısmen de daha az verimli entropi kodlamasından kaynaklanmaktadır.
Versiyon bilgisi:
İşletim Sistemi (Linux) ( uname -a
):
Linux unity 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u1 (2016-09-03) x86_64 GNU/Linux
İşletim Sistemi (Windows):
GIMP (Linux): 2.8.14 (paketten gimp
, sürümden 2.8.14-1+deb8u1
)
Pencere Fotoğraf Görüntüleyicisi (resim meta verilerine göre):
Microsoft Windows Photo Viewer 10.0.10586.0