jb2unify

From DCEwiki
Jump to: navigation, search

Tuto utilitu naprogramoval na konci dubna 2005 Yan Vernier[1].

Léon Bottou, správce DjVuLibre, ji však do kódu nezařadil, protože chtěl, aby byla podpora pro sdílení tvarů implementována přímo do cjb2 enkodéru. Tj. aby se slovníkem pracovalo rovnou při tvorbě Sjbz masky. Kromě toho měl obavu, aby někdo právně nenapadl kód DjVuLibre kvůli postupu, kterým jb2unify dělá primární selekci tvarů[2].

Byla to sice pěkná myšlenka, ovšem z praktického hlediska to nedává smysl, protože sdílení tvarů se vyplatí pouze tam, kde DjVu svazek obsahuje velké množství identických tvarů. To je ale v případě naskenovaných dokumentů spíš výjimečná situace.

I kdybychom aplikovali sofistikovanější srovnávací mechanismus, bylo zlepšení kompresního poměru mizivé ve srovnání s režijními náklady na vyhledání podobných tvarů.

Tato utilita pracuje s porovnáním tvarů 1:1. U DjVu dokumentů vytvořených z počítačově generovaných stránek svůj účel i tak splní, ale skenovaných dokumentů záleží na kvalitě předlohy. Sofistikovanějším nahrazováním tvarů na základě podobnosti písmen bychom sice uspořili nějaký datový prostor, ale vygenerovaná stránka by působila přinejmenším divně.

To byl pravděpodobně také důvod, proč Yan Vernier v implementaci podpory Djbz do nástrojů DjVuLibre dál nepokračoval.

Poznámka Utilita jb2unify není součástí žádné distribuce, protože původní repozitář se zdrojovým kódem přestal být dostupný. Podařilo se mi však z internetu původní kód vydolovat a upravit tak, aby jej bylo možné zkompilovat proti aktuální verzi DjVuLibre. V současné době je ke stažení na adrese https://github.com/velwant/jb2unify

Použití[edit]

jb2unify [-v] orig.djvu djbz.djvu [jméno_Djbz_slovníku]

Abyste porozuměli, jak tahle utilita funguje, je třeba znát postup, jak se z objektů Sjbz vrstvy sestavuje maska.

Sestavení masky z tvarů (shapes
Při sestavení masky se nejprve na základě rozměrů a DPI vytvoří prázdný objekt, do kterého se pak umísťují na bitmapové tvary – shapes, které se vybalují ze slovníku tvarů (pokud ho stránka požívá) a vrstvy Sjbz. Kromě tvarů, je součástí vrstvy Sjbz sada blitů, které popisují kam se má v rámci vytvořeného objektu tvar písmene umístit. blit je tedy kombinace identifikátoru tvaru (který odpovídá jeho pořadovému číslu) a souřadnic.
Pokud bychom měli na stránce všude pouze jeden a ten samý tvar, obsahovala by Sjbz vrstva pouze jeden tvar, a všechny blity by obsahovaly pouze jeden identifikátor – měnily by se pouze jejich souřadnice.
Tajemství ratia DjVu souborů 
je založeno na tom, že se tvary písmen opakují. Čím víc identických tvarů, tím méně se jich musí být uloženo.
Sdílení tvarů 
By default je každá DjVu stránka samostatný objekt. Tvary se tak sdílejí pouze v rámci stránky. Ovšem DjVu formát má podporu pro sdílené vrstvy, které se ke stránce připojují přes indentifikátor INCL (obsahuje jméno sdílené metadatové vrstvy či slovníku tvarů). Žádná sdílená vrstva však nevzniká automaticky – ani slovník tvarů, protože při proudovém zpracování bitmapových obrazů nelze předem určit, který tvar se bude opakovat na dalších stránkách a který ne. I jb2unify na to potřebuje dva průchody:
  1. Nejprve sestaví setříděné pole z tvarů vytažených z Djbz a Sjbz vrstev[3]
  2. …a pak postupně projede blity jednotlivých stránek.
Je-li tvar na který blit odkazuje shodný s jiným, zamění identifikátor tvaru za identifikátor tvaru, který umístí do sdíleného slovníku a pokračuje zpracováním dalšího tvaru. Do vrstvy Sjbz se ukládají pouze tvary, které se na žádné jiné stránce neopakují.
Sdílený slovník tvarů (vrstva Djbz) se pak ke stránce přilinkuje přes INCL – podobně jako když má DjVu svazek sdílenou metadatovou vrstva (která se obvykle jmenuje shared_anno.iff[4]).

Kdy vyplácí sdílení tvarů[edit]

Upozornění Utilita jb2unify je skutečně velice primitivní a nemá žádnou sofistikovanou logiku pro porovnání tvarů. Sdílený slovník sestavuje pouze z tvarů zcela identických.

Bohužel součástí blitu není ani informace o velikosti tvaru, takže pro jedno a totéž písmeno, je-li v různé velikosti, existuje i samostatný tvar.

Takové podobnosti jen stěží dosáhneme při skenování textových dokumentů. Ovšem pokud tvoříme DjVu dokumenty zpracováním souborů, co mají písmena uložená jako sady bitmapových obrazů, nebo se u nich generují v průběhu zpracování přes gsdjvu, tak zde se sdílení tvarů vyplatí, protože jich většina bude stejných.

DjVu soubory s Djbz[edit]

Sdílení tvarů však má i svá úskalí. Pokud přesouváme stránky v rámci jednoho DjVu svazku, tak se vcelku nic neděje. Stejně tak, jako když z něj nějakou stránku odstraníme – "osiřelý" tvar tak zůstane maximálně nevyužitý.

Ovšem pokud stránku, která využívá sdílený slovník tvarů kopírujeme z jednoho DjVu svazku do jiného, musí být export proveden tak, aby sebou vzala i přilinkovaný Djbz. Při generování slovníku u nově vytvořeného DjVu svazku však může nastat situace, kdy výsledný DjVu svazek nepůjde zobrazit, protože většina prohlížeček nepočítá se situací kdy se v rámci jednoho DjVu svazku používají dva slovníky tvarů.

Při generování slovníku pomocí jb2unify u pro DjVu svazek, který již obsahuje nějaký slovník tvarů, je třeba použít jméno stávajícího slovníku.


  1. Jak o tom informoval v diskuzi
  2. Obával se US patentu č. 5303313, který obsahuje následující větu:

    Na základě aplikace vynálezu jsou všechny symboly, o velikosti menší než je určitá prahová hodnota (například čtyři), při procesu identifikace symbolu eliminovány.

    Z textu je zřejmé, že jde o zcela obecný princip, který popisuje obecný způsob vykonávání činnosti (viz Co nelze patentovat?) – když třídíme kamení, také nás nezajímá písek.

    Kromě toho, podle informací na google.com, platnost US patentu č. 5303313 vypršela v uplynulém r. 2017.

  3. Vrstva 'Djbz se může stát součástí stránky je-li stránka využívající sdílení tvarů v rámci DjVu svazku vyexportována a vložena do jiného DjVu svazku.
  4. V tomto případě jde o pouhý úzus, protože se tato vrstva může jmenovat naprosto libovolně.