|
Obsługa kompresji JBIG2
Omówienie
HotPDF obejmuje teraz pełną obsługę kompresji JBIG2 (Joint Bi-level Image Experts Group 2)
JBIG2 to stratny lub bezstratny standard kompresji zaprojektowany specjalnie dla obrazów dwupoziomowych (monochromatycznych),
często używanych w dokumentach PDF dla zeskanowanych stron tekstowych i rysunków kreskowych
Najważniejsze funkcje
- Wysokowydajna kompresja obrazów dwupoziomowych
- Obsługa trybów kompresji stratnej i bezstratnej
- Optymalizacja pod kątem kompresji tekstu i rysunków kreskowych
- Znaczne zmniejszenie rozmiaru pliku w porównaniu z tradycyjnymi metodami kompresji
- Pełna obsługa zgodności z PDF/A
- Obsługa dokumentów wielostronicowych ze współdzielonymi słownikami
- Ograniczone budżety stron i pikseli z opcjonalnym natywnym fallbackiem Pascal
Korzyści kompresji
- Lepsze współczynniki kompresji: Do 3-5 razy lepsza kompresja niż Group 4 CCITT
- Dopasowywanie symboli: Z
UseSymbolDictionary powtarzające się czarne spójne składowe są zapisywane raz jako symbole, a LossyLevel pozwala niemal identycznym składowym współdzielić jeden symbol
- Oszczędność pamięci: Zoptymalizowane do przetwarzania dużych skanowanych dokumentów
Typowe zastosowania
- Skanowane dokumenty tekstowe
- Rysunki techniczne i plany
- Formularze i faktury
- Mapy i diagramy
- Dokumenty o mieszanej treści z tekstem i grafiką
Implementacja techniczna
Obsługa JBIG2 jest zaimplementowana w module HPDFJBIG2.pas, który udostępnia:
- THPDFJBIG2Decoder: Główna klasa dekodera dla danych skompresowanych JBIG2
- Przetwarzanie strumieni: Wydajna obsługa strumieni danych JBIG2
- Obsługa słowników globalnych: Współdzielone słowniki symboli dla dokumentów wielostronicowych
- Dostęp do linii skanu: Dostęp do danych wiersz po wierszu dla oszczędnego pamięciowo przetwarzania
- Obsługa słowników globalnych: współdzielone i wielopoziomowe łańcuchowe słowniki symboli z identyfikatorami segmentów 1-, 2- albo 4-bajtowymi
- Enkoder wsadowy międzystronicowy:
THPDFJBIG2Encoder.EncodePagesToByteArrays trenuje na całej partii i zwraca jeden strumień strony na wejście plus współdzielone dane globalne - Kontrakt partii:
TJBIG2BatchPage opisuje jedną spakowaną stronę, TJBIG2BatchEncodeBackend identyfikuje wybraną implementację, a TJBIG2BatchEncodeCallback definiuje zewnętrzne integracje wsadowe - Integracja z dokumentem:
THotPDF.AddJBIG2ImageBatch i THotPDF.AddJBIG2BitmapBatch kodują przed mutacją grafu PDF, podpinają współdzielony strumień /JBIG2Globals i zwracają indeksy obrazów w kolejności wejścia - Telemetria partii:
TJBIG2BatchEncodeStatistics raportuje wybrany backend, rozmiary wejścia i wyjścia, liczbę symboli natywnych oraz odrzucenia z budżetu - Odzyskiwanie backendu:
HPDFJBIG2EncRegisterBackends przywraca oba wbudowane callbacki enkodera po wyczyszczeniu tymczasowych nadpisania przez aplikację - HPDFJBIG2SplitSymbolDictionaryGlobals: rozdziela sekwencyjny strumień osadzony na słowniki globalne i segmenty obrazu stron, zachowując nagłówki zależności w formie długiej
- Dekodowanie widocznego regionu:
THPDFJBIG2Decoder.LoadRegionFromByteArray alokuje tylko żądane okno, rozwiązuje jego przechodnie zależności słownikowe, składa przecinające się regiony strony z przycinaniem i pomija niezależne regiony poza oknem przed dekodowaniem entropijnym - Telemetria dekodowania regionów:
LastRegionDecodeStats raportuje liczby regionów zdekodowanych i pominiętych plus zdekodowane piksele źródłowe, a UsedIncrementalRegionDecode odróżnia natywną ścieżkę oknową od fallbacku pełnego dekodowania - Dostęp skanliniowy: dostęp do danych wiersz po wierszu dla przetwarzania oszczędnego pamięciowo
Przykład użycia
// Przykład Delphi - przetwarzanie danych skompresowanych JBIG2
procedure ProcessJBIG2Data;
var
PDF: THotPDF;
Decoder: THPDFJBIG2Decoder;
ImageData: TBytesArray;
ScanlineData: TBytesArray;
Row: Integer;
begin
PDF := THotPDF.Create(nil);
Decoder := THPDFJBIG2Decoder.Create;
try
PDF.BeginDoc;
PDF.AddPage;
// Wczytaj skompresowane dane obrazu JBIG2
if Decoder.LoadFromByteArray(ImageData) then
begin
// Przetwarzaj linia po linii dla oszczędności pamięci
for Row := 0 to Decoder.Height - 1 do
begin
if Decoder.GetScanline(Row, ScanlineData) then
begin
// Przetwarzaj dane linii skanu zgodnie z potrzebami
// Dodaj do strony PDF
end;
end;
end;
PDF.EndDoc;
finally
Decoder.Free;
PDF.Free;
end;
end;
Opcje enkodera i backendy
- THotPDF.JBIG2Options:
THPDFJBIG2Options dokumentu, które AddImage(..., icJBIG2) zamienia na TJBIG2EncodeOptions. Wartości domyślne pasują do skanów: Lossless=True, LossyLevel=5, RemoveIsolatedBlackPixels=True i BlackDotSize=3
- Usuwanie drobnych plam: Dopóki
RemoveIsolatedBlackPixels jest True, czarne spójne składowe o szerokości i wysokości mniejszych niż BlackDotSize są czyszczone przed kodowaniem, więc domyślne ustawienia usuwają kropki 2 x 2 piksele i mniejsze. Ustaw False, gdy wyjście ma zgadzać się z bitmapą piksel w piksel
- Wybór enkodera:
UseExternalEncoder (domyślnie True) używa zarejestrowanego wydajnego enkodera arytmetycznego; gdy jest wyłączony, nieobecny albo zawodzi, zapisywany jest wbudowany bezstratny region ogólny MMR. UseNativeArithmeticFallback=True przed MMR próbuje wbudowanego kodera arytmetycznego w Pascalu, a przy UseSymbolDictionary=True najpierw próbuje słownika symboli z regionami tekstu
- DefaultJBIG2EncodeOptions: Opcje używane przez samodzielny
THPDFJBIG2Encoder: bezstratne, z LossyLevel=0 i bez usuwania plam
- Wybór dekodera:
THotPDF.UseExternalJBIG2Decoder (domyślnie True) dekoduje załadowane obrazy /JBIG2Decode wydajnym backendem, gdy jest dostępny; False używa wbudowanego dekodera w Pascalu
- Własne backendy:
RegisterJBIG2EncoderBackend i RegisterJBIG2DecoderBackend instalują callbacki aplikacji, IsJBIG2EncoderBackendAvailable i IsJBIG2DecoderBackendAvailable raportują ich obecność, a ClearJBIG2Backends usuwa je
Opis klasy
THPDFJBIG2Decoder
- LoadFromByteArray: Wczytuje dane JBIG2 z tablicy bajtów; zwraca False, gdy dane są niekompletne albo niewspierane
- GetScanline: Pobiera dane określonej linii skanu
- Width/Height: Właściwości wymiarów obrazu
Optymalizacja wydajności
- Oszczędne pamięciowo przetwarzanie linii skanu
- Zoptymalizowane do obsługi dużych dokumentów
- Minimalne użycie pamięci podczas dekompresji
- Zoptymalizowane pod obsługę dużych dokumentów
- Minimalny ślad pamięciowy podczas dekompresji
- Przetwarzanie scanline oszczędne pod względem pamięci
Zgodność ze standardami
- Zgodność ze standardem ITU-T T.88
- Obsługa standardu ISO/IEC 14492
- Image XObjects w PDF 1.4 lub nowszym z
/JBIG2Decode i /JBIG2Globals - HotPDF nie zapisuje JBIG2, gdy aktywne jest wyjście PDF/A:
AddImage(..., icJBIG2) zapisuje zamiast tego icCCITT42, a wstawianie wsadowe zwraca False
- Spójność między platformami
Zobacz też
|