Regresif JPEG
(maurycyz.com)- İlerlemeli JPEG'in çoklu tarama yapısı değiştirilerek, indirme ilerledikçe görüntü kalitesinin artması yerine, ekranda gösterilen görüntünün sürekli başka bir görüntüyle değişmesi sağlanabilir
- Her tarama; renk kanallarını, DCT frekans aralığını ve hassasiyeti belirtir; aynı çözünürlükteki JPEG'lerde bazı işaretleyiciler kaldırılıp art arda eklendiğinde mevcut işleme verisinin üzerine yazılabilir
- Kod çözücüler, sıkıştırma bombasına benzer sorunları önlemek için işleyecekleri tarama sayısını sınırlar; Chrome yaklaşık 90 kareye kadar işler, Firefox vb. ise daha fazlasını işler
- Her karede yalnızca DC'ye özel tek bir tarama kullanılırsa kare sayısı artırılıp izler önlenebilir, ancak DCT blok yapısı nedeniyle ortaya çıkan çözünürlük özgünün 1/16'sına düşer
- Tek bir JPEG içinde video gibi birden fazla kare taşınabilir, ancak zamanlama bilgisi olmadığından oynatma hızı ağ gecikmesine bağlıdır; pratik videodan çok kısmi işleme kullanan HTML ve tek sayfalı uygulama deneyleri için uygundur
İlerlemeli JPEG görüntüyü nasıl gösterir
- JPEG, düşük frekans bileşenlerini önce sakladığı için dosya kısmen indirilmişken kırpılmış bir görüntü yerine düşük çözünürlüklü bir önizleme gösterebilir
- Sıkıştırılmış veri birden çok tarama (scan) bölümüne ayrılır ve her taramanın önünde bir başlık bulunur
FF DA, tarama başlangıç işaretleyicisidir- Ardından uzunluk alanı, dahil edilen kanal sayısı ve kimlikleri ile Huffman tablo indeksleri gelir
- Başlangıç ve bitiş DCT bin'leri ile hassasiyet belirtildikten sonra Huffman ile kodlanmış DCT katsayıları saklanır
- İlk tarama, üç renk kanalındaki en düşük DC frekans bin değerini içerir
YCbCr ve aşamalı kalite iyileştirmesi
- JPEG'in üç renk kanalı, yaygın RGB yerine YCbCr kullanır
Y, parlaklık bileşenidir ve yüksek kalite gerektirirCb,Crrenk farkı bileşenleridir; kalite düşse de görsel etkisi sınırlıdır- Çok kabaca ifade edilirse
Y = G,Cb = B - G,Cr = R - Golur
- Örnek JPEG, 0'dan 9'a kadar taramalarda veriyi aşamalı olarak doldurur
- Tarama 0:
Y Cb Cr, DCT bin0–0değerini yarım hassasiyetle saklayarak çok düşük çözünürlüklü bir önizleme sağlar - Tarama 1:
Y,1–5bin'lerini 1/4 hassasiyetle ekleyerek parlaklık ayrıntısını güçlendirir - Tarama 2·3:
Cb,Criçin1–63bin'lerini yarım hassasiyetle ekler - Tarama 4:
Yiçin6–63bin'lerini 1/4 hassasiyetle doldurarak Tarama 1'in bıraktığı aralığı tamamlar - Tarama 5:
Yiçin1–63bin'lerini yarım hassasiyetle iyileştirir - Tarama 6–9: Her kanala son bitleri ekleyerek tam kaliteye ulaşır
- Tarama 0:
- Renk farkı verisi parlaklıktan önce tamamlansa da renk farkı yarım çözünürlükte, yani 1/4 piksel sayısıyla saklandığından
Cr + Cbtoplam kapasitesi de parlaklığın yalnızca yarısıdır
İndirme sırasında görüntüyü değiştirmek
- Her tarama uygulanacak frekans aralığını belirttiği için, sonraki taramalarla daha önce işlenmiş görüntü verisinin üzerine yazan JPEG'ler oluşturulabilir
- Aynı çözünürlükte birden fazla görüntü art arda eklenir ve sonraki işaretleyiciler filtrelenerek uygulanır
- image start (start-of-image)
- frame start (start-of-frame)
- image end (end-of-image)
- Bir hex editörüyle de yapılabilir, ancak gerçek üretimde basit bir C programı kullanılır
- Dosya yavaş bir ağ üzerinden aktarılırsa, indirme sırasında birden çok görüntü sırayla değişir
Kod çözücülerin tarama sınırı
- JPEG kod çözücülerin çoğu belirli sayıda tarama işledikten sonra durur
- Bunun, sıkıştırma bombasına benzer sorunları önlemek için konmuş bir sınır olduğu düşünülüyor; basit birleştirme yöntemiyle 9 kareden fazlasını uygulamak zordur
- Daha uzun animasyonlar yapmak için kare başına gereken tarama sayısını en aza indirmek gerekir
Neden Baseline JPEG kullanılamıyor
- Tek taramalı Baseline JPEG ile başlama yaklaşımı çalışmaz
- İlerlemeli modda, tek bir taramaya DC verisi olan bin 0 ile AC verisi olan bin 1 ve üzeri birlikte konulamaz
- Baseline modunda bu kısıt yoktur, ancak Baseline kod çözücü ilk taramadan sonra işlemeyi durdurur
- AC verisi DC verisinden sonra gelmek zorunda olduğundan, en küçük ilerlemeli JPEG karesi yalnızca DC'ye özel tek bir taramadan oluşur
Yalnızca DC içeren karelerin yapısı ve çözünürlüğü
- DCT, 16×16 bloklar halinde işlendiği için yalnızca DC verisi bulunsa bile tek renk yerine, özgün görüntünün 1/16 çözünürlüğünde bir görüntü elde edilebilir
- En küçük kare,
Y Cb Crüç kanalının DCT bin0–0değerini tam hassasiyetle saklayan tek bir tarama kullanır - Bu yapıda Chrome, işlemeyi durdurmadan önce yaklaşık 90 kare işler
- Firefox gibi diğer tarayıcılar daha fazla tarama işler
- 90 taramadan oluşan görüntüler neredeyse tüm tarayıcılarda çalışır
İz bırakmayan kare geçişleri
- Basit birleştirme yöntemindeki izlenim, AC taramalarının mevcut veriyi daha hassas hale getirmek için tasarlanmış olmasından kaynaklanır
- Normal bir ilerlemeli JPEG'de, dosya boyutunu çok artırmadan birden fazla hassasiyet aşaması taşınabilir; ancak bu, görüntü değiştirme yaklaşımına uygun değildir
- Gerçek bir ilerlemeli iyileştirme olmadan yalnızca DC taramaları kullanılırsa, önceki AC verisinin hassaslaştırılması gerçekleşmez ve izler önlenebilir
- Yalnızca DC içeren kareler standart uyumlu JPEG görüntüleridir, bu yüzden özel bir kodlayıcı gerekmez
- Tarama tanımı, üç kanalın yalnızca DC bin'lerini belirten
0,1,2:0-0,0,0;biçiminde olabilir
- Tarama tanımı, üç kanalın yalnızca DC bin'lerini belirten
Tek bir JPEG videonun sınırları
- Yalnızca DC içeren kareler art arda eklenirse, tek bir JPEG dosyasında tam bir video taşınabilir
- JPEG taramalarına kare zamanlaması eklemenin bir yolu olmadığından, oynatma hızı tamamen ağ gecikmesine bağlıdır
- Alışılmadık Rickroll'lar veya şakalar dışında pratik bir kullanım alanı yoktur
Kısmi işlemeyi genişleten deneyler
- Kısmi işleme kullanılarak JPEG kare değiştirme dışında başka deneyler de yapılabilir
<dialog>etiketiyle yapılmış saf HTML video ile Bad Apple videosu uygulanmıştır- Veriyi dosyaya gömmeye gerek kalmadan, CSS veya JavaScript içermeyen etkileşimli tek sayfalı uygulama da uygulanmıştır
- Görüntü üretimi için
merge.cC kodu kullanılmıştır
1 yorum
Hacker News yorumları
Adam7 interlace PNG ile çok benzer bir şey denemiştim: https://www.da.vidbuchanan.co.uk/adamation/image.png
Oynatma eninde sonunda ağ gecikmesine bağlı olsa da, sunucuyu her kareyi belirli aralıklarla ayrı ayrı gönderecek şekilde yapılandırmıştım. Kareler küçük olduğundan, ağ olağanüstü yavaş değilse oynatma zamanını sunucu belirliyor.
Refreshayarlayarak istemcinin yeni animasyon karesini periyodik olarak almasını da sağlayabilirsiniz[1]. 2013 IOCCC başvurusu da PNG olarak render edilmiş bir saati sürekli güncellemek için bu tekniği kullanıyor[2][1] https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/...
[2] https://www.ioccc.org/2013/mills/index.html
Sonraki satırda
Refreshbaşlığı tersine kodlanmış: https://github.com/ioccc-src/winner/blob/619f554bbdb19e5003a...Lanetli bir teknik ama kesinlikle buraya yakışıyor.
Bu teknikle veriyi göz önünde saklayan steganografi yapılıp yapılamayacağını merak ediyorum. Otomatik görüntü analiz programlarının çoğu muhtemelen yalnızca son görüntüyü kontrol eder; bu yüzden öğrencilerin okulun içerik filtrelerini aşmak için kullanabileceği bir şey gibi görünüyor.
Aynı ağda paralel yüklenen işlerin ilerleme çubuğu olarak kullanılıp kullanıcıların kalan gecikmeyi tahmin etmesi sağlanamaz mı diye düşünüyorum.
Web sunucusu anında “JPEG” üretip bunu istemciye zaman aralıklı parçalar halinde gönderirse, oynatma zamanını bir ölçüde kontrol edebilir. Kaynak olarak web kamerası kullanılırsa hiç bitmeyen bir “JPEG” de mümkün.
multipart/x-mixed-replaceadlı MIME tekniğiyle uyguluyor. Sunucunun, az önce gönderdiği veriyi yeni veriyle değiştirmesini istemciye söylemesi şeklinde çalışıyor; JavaScript olmadan, yalnızca sıradan HTTP ve JPEG ile işliyor.Service Worker ile yavaş bağlantı taklidi yaparsanız oynatma hızını kontrol edebilirsiniz.
Ortama göre davranışın farklı olması tuhaf. Masaüstü Firefox’ta düzgün oynuyor ama iOS mobilde “JPEG içindeki tüm video” neredeyse tek renkli kahverengi→turuncu→kırmızı 3 kare ve bulanık bir kedi silüetinden ibaret görünüyor.
Renk kareden kareye değiştiği için çalıştığı anlaşılıyor ama buna video demek zor. Masaüstünde gerçek video gibi oynadığı için şaşırdım; iOS görüntü kod çözücüsünün tuhaf bir sınır durumuna dokunuyor gibi.
Yakın zamanda OpenGL ve jpeg-turbo ile görüntüleri hızlı göstermeye çalıştım; JPEG’in progressive modunu açınca kod çözme ciddi biçimde yavaşladı. Progressive JPEG’in iyi olduğu yönündeki eski tavsiyenin artık geçerli olmama ihtimali yüksek.
On yıllardır görüntülerin aşamalı olarak netleştiğini neredeyse hiç görmediğim için pratik değeri de yok gibi.
Örnek: https://youtube.com/watch?v=UphN1_7nP8U
İlk görüntünün “yanlış” katsayılarından yüksek frekans katsayılarını zor yoldan hesaplama fikri aklıma gelmişti; ama sadece iki görüntüyü birleştirme yöntemi zekice. Bir görüntünün düşük frekans bileşenlerinin arkasına başka bir görüntünün yüksek frekans bileşenlerini eklemek bile şaşırtıcı derecede iyi çalışıyor.
Kamerayla düşük frekans bileşenlerini doğrudan elde etmenin de mümkün olup olmadığını merak ediyorum. k-uzayında düşük frekansları önce alan MRI yöntemi de aklıma geliyor.