|
JBIG2 Compression Support
当前支持边界
HotPDF 为扫描文本、表单和线条艺术使用的二值图像提供 JBIG2 压缩与解码
API 行为
- 面向二值图像的高效压缩
- 同时支持有损和无损压缩模式
- 针对文本和线条艺术压缩优化
- 与传统压缩方法相比显著减小文件体积
- 多页编码,全部 image XObject 共享一个训练出的符号字典
- 分类前的精确重复页检测,以及 PDF 组装期对已编码 XObject 的复用
- 有界的页面与像素预算,可选的原生 Pascal 回退
压缩优势
- 跨页复用:重复符号只分类一次,存入共享全局数据
- 符号匹配:开启
UseSymbolDictionary 后,重复的黑色连通分量只作为符号存储一次,LossyLevel 让近乎相同的分量共用一个符号
- 内存高效:为处理大型扫描文档优化
典型用例
- 扫描文本文档
- 技术图纸和蓝图
- 表单和发票
- 地图和图表
- 文本与图形混合的文档
技术实现 JBIG2 实现通过这些 API 提供原生 Pascal 路径和可选的静态外部后端 - THPDFJBIG2Decoder:JBIG2 压缩数据的核心解码器类
- 原生编码覆盖:MMR generic region、MQ generic region、算术与标准 Huffman 符号字典及文本区域、refinement 符号、聚合符号、refinement 文本实例、保留的算术上下文,以及有界的长格式引用表
- 有界上下文复用:generic 与 refinement 概率库按模板感知的大小保留,在 fan-out 依赖间隔离,源或模板不兼容时拒绝
- 流处理:高效处理 JBIG2 数据流
- 全局字典支持:共享及多级链式符号字典,支持 1、2 或 4 字节段标识符
- 跨页批量编码器:
THPDFJBIG2Encoder.EncodePagesToByteArrays 在整批上训练,每个输入返回一个页面流外加共享全局数据 - 批量契约:
TJBIG2BatchPage 描述一个打包页面,TJBIG2BatchEncodeBackend 标识选中的实现,TJBIG2BatchEncodeCallback 定义外部批量集成 - 文档集成:
THotPDF.AddJBIG2ImageBatch 与 THotPDF.AddJBIG2BitmapBatch 在改动 PDF 图之前编码,附加共享的 /JBIG2Globals 流,并按输入顺序返回图像索引 - 批量遥测:
TJBIG2BatchEncodeStatistics 报告选中的后端、输入与输出大小、原生符号数以及预算拒绝 - 后端恢复:
HPDFJBIG2EncRegisterBackends 在临时应用级覆盖被清除后恢复两个内建编码器回调 - HPDFJBIG2SplitSymbolDictionaryGlobals:把顺序嵌入流拆分为全局字典与页面图像段,同时保留长格式依赖头
- 可见区域解码:
THPDFJBIG2Decoder.LoadRegionFromByteArray 只分配请求的窗口,解析其传递字典依赖,带裁剪地组合相交页面区域,并在熵解码前跳过独立的窗外区域 - 区域解码遥测:
LastRegionDecodeStats 报告已解码与已跳过的区域数以及解码的源像素,UsedIncrementalRegionDecode 区分原生窗口路径与完整解码回退 - 扫描行访问:逐行数据访问,内存高效处理
Usage Example
// Encode: use the built-in high-performance backend by default
// Set UseNativeArithmeticFallback := True to try Pascal arithmetic before MMR fallback
PDF.JBIG2Options.UseExternalEncoder := True;
PDF.JBIG2Options.UseNativeArithmeticFallback := True;
PDF.JBIG2Options.UseSymbolDictionary := True;
PDF.JBIG2Options.LossyLevel := 1;
PDF.JBIG2Options.RemoveIsolatedBlackPixels := True;
PDF.JBIG2Options.BlackDotSize := 3;
ImageIndex := PDF.AddImage(Bitmap, icJBIG2);
// Decode: use the built-in high-performance backend by default
// Set UseExternalJBIG2Decoder := False to use the built-in decoder
procedure ExtractFirstJBIG2(const FileName: string);
var
Doc: THotPDF;
Bmp: TBitmap;
begin
Doc := THotPDF.Create(nil);
try
Doc.UseExternalJBIG2Decoder := True;
Doc.LoadFromFile(FileName);
if Doc.GetLoadedImageCount > 0 then
begin
Bmp := Doc.ExtractLoadedImage(0);
try
// Use the extracted bitmap
finally
Bmp.Free;
end;
end;
finally
Doc.Free;
end;
end;
// Optional: register application callbacks to override the default backends
procedure RegisterCustomBackends;
begin
RegisterJBIG2EncoderBackend(MyJBIG2EncodeBackend);
RegisterJBIG2DecoderBackend(MyJBIG2DecodeBackend);
end;
编码器选项与后端
- THotPDF.JBIG2Options:文档的
THPDFJBIG2Options,AddImage(..., icJBIG2) 会把它转成 TJBIG2EncodeOptions。默认值适合扫描件:Lossless=True、LossyLevel=5、RemoveIsolatedBlackPixels=True 和 BlackDotSize=3
- 斑点去除:
RemoveIsolatedBlackPixels 为 True 时,宽和高都小于 BlackDotSize 的黑色连通分量会在编码前被清除,因此默认设置会去掉 2 x 2 像素及更小的黑点。输出必须与位图逐像素一致时把它设为 False
- 编码器选择:
UseExternalEncoder(默认 True)使用注册的高性能算术编码器;关闭、缺失或失败时写出内建的无损 MMR generic region。UseNativeArithmeticFallback=True 会在 MMR 之前先尝试内建 Pascal 算术编码器,且 UseSymbolDictionary=True 时先尝试带文本区域的符号字典
- DefaultJBIG2EncodeOptions:独立
THPDFJBIG2Encoder 使用的选项:无损、LossyLevel=0、不做斑点去除
- 解码器选择:
THotPDF.UseExternalJBIG2Decoder(默认 True)在后端可用时用高性能后端解码已加载的 /JBIG2Decode 图像;False 使用内建 Pascal 解码器
- 自定义后端:
RegisterJBIG2EncoderBackend 和 RegisterJBIG2DecoderBackend 安装应用回调,IsJBIG2EncoderBackendAvailable 和 IsJBIG2DecoderBackendAvailable 报告它们,ClearJBIG2Backends 移除它们
类参考 THPDFJBIG2Decoder
- LoadFromByteArray:从字节数组加载 JBIG2 数据;数据不完整或不支持时返回 False
- GetScanline:读取指定的扫描行数据
- Width/Height:图像尺寸属性
性能优化 - 固定的 100 页扫描语料:逐页独立 generic region 压缩为 158,300 字节,经跨页外部训练后为 33,600 字节,缩减 78.8%
- 回归基准中,同一语料在 Win64 上从 53 ms 降到 11 ms,Win32 上从 77 ms 降到 16 ms
- 页到符号的查找带索引,重复的已编码页面流会被缓存,批量提取为常数时间
- 省内存的扫描行处理
- 为大文档处理优化
- 解压期间内存占用极小
标准合规 - 符合 ITU-T T.88 标准
- 支持 ISO/IEC 14492 标准
- PDF 1.4 及更高版本的 image XObject,带
/JBIG2Decode 与 /JBIG2Globals - PDF/A 输出激活期间 HotPDF 不写 JBIG2:
AddImage(..., icJBIG2) 会改为写 icCCITT42,批量插入返回 False - 跨平台行为一致
另请参阅
|