一、DjVu技术
我说DjVu技术“还算不错”,是因为:
1、DjVu基于ISO/IEC 16485 MRC(Mixed Raster Content)模型,在图像分层、图像编码方面有一些独到之处,因而造就了DjVu“压缩率高”的名声,其中的原因我在《DjVu转PDF》的第二章“理论”部分已经详细描述过,此处从略。
2、由于专门定位于扫描文档,不考虑文字显示,因此在DjVu标准规范中可以省略字体等内容,直接用UTF-8编码表示可检索的隐藏文字内容,比PDF等格式更简洁一些。
但是DjVu技术也并非完美无缺:
1、扫描分辨率与有损压缩的误码率
DjVu在压缩文字部分时通常采用JB2压缩,可以是无损,也可以是有损。在有损情况下,如果扫描分辨率不足,可能会因为误码而导致生成的DjVu出现错别字,因此在我见过的DjVu相关技术文档中,都强调扫描分辨率不要低于300 DPI。误码的原因、实例见《DjVu转PDF》一文。
从目前的情况看,汉字的误码率要高于字母文字。
2、缺乏对灰度图像的支持
在分辨率不足(低于200 DPI)的情况下,如果强制要求简化成黑白二色,可能会出现文字残缺的情况,而采用灰度图像(如16级灰度),则可以在文件长度与显示效果之间取得平衡,这也是PDG大图版的做法。但不幸的是,DjVu格式本身对灰度图像支持匮乏:
a) 如果转换成单层DjVu,采用JB2压缩显然会出现上面说的笔划残缺问题,采用IW44压缩则在大压缩比下会模糊。
b) 转换成双层DjVu明显不行,因为双层DjVu要求每个shape只能有一种颜色,而灰度图像每个字有多级灰度。
c) 转换成三层DjVu,灰度信息靠底层图像提供,在采用大压缩比(大比例缩图、低码率)情况下,文字会出现模糊,甚至成为灰灰的一团。
解决办法不是没有,不过麻烦一点,效果如何要看技术和运气:放大(如从150 DPI放大至300 DPI)、处理后减色成黑白二色、转换成JB2压缩的单层DjVu。
3、对MRC模型支持的局限
DjVu基于ISO/IEC 16485 MRC三层模型,但是没有考虑该模型的Stripes、N层模型等扩展情况,因此插图如果在整个页面中所占比例不大,经过大比例压缩再放大显示后,插图看起来总是模模糊糊的,影响观感。
4、批量处理难以摆脱人工干预
DjVu文件的压缩率、生成后的视觉效果等,其实与图像类型的准确识别有很大关系。这里说的“图像类型的准确识别”,就是指在碰到一副扫描好的静态图像后,准确判断出应该转换成单层、双层还是三层DjVu,并确定各层的压缩比。这种判断在很大程度上是一种经验值,所以在商业DjVu制作软件中,都有N多种预设值,需要人工进行挑选,以获得最佳效果。换句话说,如果所有文档不分青红皂白都按三层(document)进行转换,碰到前面说的灰度图像时难免会哭笑不得。这些都给完全自动化批量DjVu生成带来了困难。而商业应用看重的恰恰是这种能力。
5、先天不足、内外有别的格式标准
在我看来,DjVu其实不应该算是一种“文档格式”,而应该算是一种“图像格式”,因为与PDF等文档格式比起来,欠缺的东西实在太多,包括多格式文本、矢量图、多媒体、脚本、交互表单、权限控制、安全鉴别等等,所以只适合表示扫描图像,而不适用于常规文档。但即使这样,DjVu格式本身也不是完全公开的格式(open format),如最新的“安全DjVu”(SDJVU)格式,就只有DjVu格式的商业拥有者Celertem公司才有,也只被该公司及其关系公司所提供的产品所支持,其他细节外界未知,所以被讥讽为“published format”,原帖地址:
249K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3c8B7N6Y4g2Q4x3X3g2G2M7X3N6Q4x3V1k6X3L8%4u0#2L8g2)9J5c8Y4m8Z5M7r3u0T1i4K6u0r3N6X3W2W2N6%4c8G2M7r3W2U0i4K6u0W2M7r3S2H3i4K6y4r3N6q4)9K6c8o6b7J5x3R3`.`.
该贴作者jrile是原PlanetDjVu社区的创始人兼站长,在DjVu社区也算大名鼎鼎。
6、工具与支持的匮乏
在现在这个时代,除非有MS Office这样的强势,否则一种文件格式的推广应用,离不开开源社区的强力支持。但是目前DjVu基本上算不上是一种开放的格式,除了前面说的文档格式标准混乱外,最新、最好的DjVu格式生成工具、SDK都掌握在Celertem公司及其关系公司手里,这些都是要钱的,而且还很不便宜。
目前与DjVu相关的免费、开源的东东,最终都可以追溯到djvulibre(
338K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4y4G2N6i4u0U0k6h3k6G2M7X3N6W2i4K6u0W2L8X3g2@1i4K6u0r3M7s2u0G2K9X3g2U0N6s2y4Q4x3V1k6V1K9Y4k6#2i4K6u0r3i4@1g2r3i4@1u0o6i4K6R3&6i4@1f1%4i4K6W2m8i4K6R3@1i4@1f1^5i4@1u0m8i4@1q4n7i4@1f1@1i4@1t1^5i4K6S2m8i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1%4i4K6V1H3i4K6R3$3i4@1f1^5i4@1q4q4i4@1u0m8i4@1f1@1i4@1t1^5i4K6S2m8i4@1f1^5i4@1u0r3i4K6V1&6i4@1f1@1i4@1t1^5i4@1q4m8i4@1f1&6i4@1p5I4i4@1t1&6i4@1f1%4i4K6W2n7i4@1q4q4i4@1f1%4i4K6V1@1i4@1t1I4c8r3A6h3N6g2!0q4y4#2)9&6b7g2)9^5y4q4!0q4y4g2)9&6y4g2)9^5y4W2!0q4y4q4!0n7z5q4)9&6b7g2!0q4y4W2)9^5b7W2!0m8y4g2!0q4y4W2)9&6b7#2)9^5z5g2!0q4z5q4)9^5x3q4)9^5y4g2!0q4c8W2!0n7b7#2)9^5z5q4!0q4y4W2)9&6b7#2)9^5x3q4!0q4y4W2)9&6y4#2!0m8z5g2!0q4y4W2)9&6z5q4!0m8c8V1q4f1i4K6t1$3g2q4!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4#2)9^5y4q4!0n7y4W2!0q4y4g2)9&6x3q4)9^5c8g2!0q4y4W2)9&6z5q4!0m8c8V1I4A6P5X3q4J5k6q4c8W2j5$3S2Q4c8f1k6Q4b7V1y4Q4z5o6W2Q4c8e0N6Q4b7V1u0Q4b7U0c8Q4c8e0k6Q4z5p5q4Q4b7e0c8Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0c8Q4b7V1c8Q4z5o6k6Q4c8e0k6Q4z5e0S2Q4b7f1k6Q4c8e0g2Q4b7f1g2Q4z5f1g2Q4c8e0W2Q4z5e0W2Q4z5o6g2Q4c8e0c8Q4b7U0S2Q4z5p5q4Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0c8Q4b7U0S2Q4z5p5g2Q4c8e0N6Q4z5f1y4Q4z5f1k6Q4c8e0k6Q4b7f1c8Q4b7e0y4Q4c8e0g2Q4z5e0g2Q4z5o6k6Q4c8e0c8Q4b7U0S2Q4z5f1q4Q4c8e0g2Q4z5p5y4Q4z5e0k6Q4c8e0N6Q4z5f1q4Q4z5o6c8e0c8p5E0Q4c8e0N6Q4z5f1u0Q4b7U0S2Q4c8e0k6Q4b7f1k6Q4z5e0c8Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0g2Q4b7U0N6Q4b7f1g2Q4c8e0g2Q4b7V1g2Q4z5e0N6Q4c8e0S2Q4b7V1k6Q4z5f1y4Q4c8e0c8Q4b7V1q4Q4z5o6k6Q4c8e0g2Q4z5p5g2Q4b7V1u0Q4c8f1k6Q4b7V1y4Q4z5f1p5`.
a)djvulibre不具有最核心的功能——图像分层功能,基本上只能制作单层DjVu,如果需要制作三层DjVu,则需要用其他代码或工具解决图像分层问题。仅此一条,就可以保证商业SDK不会被免费的djvulibre所取代。
b)对于JB2压缩,djvulibre不具有共享字典生成能力,生成的DjVu文件可能会比采用商业SDK生成的DjVu文件更大。
c)我以前看到的文档曾说djvulibre的源代码出自LizardTech代码库,与该公司发行的商业SDK采用的源代码相同,但是真正找了LizardTech发行的商业SDK一编译,才知道不是这么回事:SDK说明文档会告诉你,此djvulibre非彼djvulibre;编译器则会告诉你,你获得的djvulibre源代码与商业SDK使用的djvulibre源代码相比,少了好些东西。
d)不知道是有意还是无意,尽管djvulibre声称采用了智能的内存管理模式,但是实际用过的人都知道,这套源代码的内存漏洞多到数不清(我自己花了4年时间补洞),以致于我不相信任何一家稍有常识的商业软件公司会基于这套源代码,开发自己的商业应用。
e)djvulibre源代码是基于GPL的,这也在一定程度上堵塞了它的商业应用之路。
f)djvulibre前后两任的拥有者(LizardTech、Celertem)对该社区的支持并不多,如我前面说过的内存漏洞问题,几年前就有人提出,但是一直死不认账。对其他DjVu相关社区的支持就更是没有,如jrile在关闭PlanetDjVu社区后,选取了该社区中的部分帖子,以《The Future of DjVu - Revisited》为题发布在djvu.org社区:
998K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3c8B7N6Y4g2Q4x3X3g2G2M7X3N6Q4x3V1k6X3L8%4u0#2L8g2)9J5c8Y4m8Z5M7r3u0T1i4K6u0r3N6X3W2W2N6%4c8G2M7r3W2U0i4K6u0W2M7r3S2H3i4K6y4r3N6q4)9K6c8o6f1J5y4R3`.`.
在这个帖子中,他对DjVu的种种看法,足以吓到一般人。
除上述缺陷外,从技术上讲,DjVu格式本身并不是不可替代的:DjVu所依赖的ISO/IEC 16485 MRC三层模型,同样可以应用到PDF上,并达到相似的压缩比与视觉效果,详见我写的《DjVu转PDF》一文。
有趣的是,djvulibre从v3.5.21开始,在Ddjvu例子中也加入了DjVu转PDF功能,但采用的是libtiff的tiff2pdf源代码。换句话说,是先把DjVu转换成TIFF,然后再转换成PDF,支持CCITT G4、JEPG、zip压缩。这样的转换方式,不仅完全不管MRC三层模型,而且丢失了原JB2、IW44压缩的高效率,转换出来的PDF自然会增肥许多,然后某些人又可以振振有词地说:你看,DjVu转换成PDF以后就是会变大吧!
所以,DjVu技术尽管不错,但也仅仅是“还算不错”。
二、掌握DjVu技术的人
DjVu格式于1996年由AT&T提出,所以文件的头4个字节就是“AT&T”。
AT&T在DjVu上的投入并不多,这一点从AT&T发布的源代码和SDK可以看出。2000年时DjVu格式被倒卖给了LizardTech,一家专注于文档扫描的公司。
LizardTech对DjVu文件格式规范、djvulibre的贡献有目共睹,遗憾的是几年后也撑不下去了,2007年被日本的Celertem所收购。但奇怪的是,在Celertem公司产品主页(
52aK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3y4W2L8r3q4J5N6r3g2E0i4K6u0W2j5$3!0E0i4K6u0r3k6h3&6Q4x3V1k6H3M7X3!0V1N6h3y4@1M7#2)9J5c8W2!0q4c8W2!0n7b7#2)9^5z5g2!0q4x3#2)9^5x3q4)9^5x3g2!0q4y4q4!0n7z5q4)9^5b7W2!0q4z5q4!0n7c8q4!0n7c8q4!0q4y4q4!0n7z5q4!0n7b7W2!0q4z5g2!0m8x3g2!0n7y4g2!0q4c8W2!0n7b7#2)9^5z5r3S2@1N6s2m8Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2U0k6h3I4S2M7Y4c8W2L8g2)9J5k6h3y4G2L8g2)9J5c8X3g2F1i4K6u0r3k6r3!0%4L8X3I4G2j5h3c8Q4x3V1k6Q4c8f1k6Q4b7V1y4Q4z5o6W2Q4c8e0c8Q4b7U0S2Q4z5p5q4Q4c8f1k6Q4b7V1y4Q4z5p5y4p5L8$3y4#2L8h3g2F1N6l9`.`. Express的版本似乎有点老,最新版似乎在另外一家公司caminova的产品页(
245K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3y4S2L8h3W2F1L8%4k6S2i4K6u0W2K9Y4m8Q4x3V1k6W2L8W2)9J5c8Y4m8J5L8$3c8#2j5%4c8K6i4K6u0r3i4K6y4r3M7%4u0U0i4K6y4p5M7s2u0G2k6s2g2U0N6s2x3J5i4K6u0W2j5i4y4H3P5q4!0q4c8W2!0n7b7#2)9^5z5g2!0q4x3#2)9^5x3q4)9^5x3g2!0q4y4q4!0n7z5q4)9^5b7W2!0q4z5q4!0n7c8q4!0n7c8q4!0q4z5g2!0m8x3g2!0n7y4g2!0q4c8W2!0n7b7#2)9^5z5r3S2@1N6s2m8Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2U0j5h3#2A6L8X3!0$3j5g2)9J5k6h3A6H3i4K6u0r3k6h3&6Q4x3V1k6V1L8%4N6F1L8r3!0S2k6s2y4Q4x3V1k6Q4c8f1k6Q4b7V1y4Q4z5o6W2Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0k6Q4z5o6W2Q4z5o6m8Q4c8e0c8Q4b7V1u0Q4b7e0g2Q4c8e0k6Q4z5o6S2Q4z5e0q4Q4c8e0k6Q4z5o6m8Q4z5o6m8Q4c8e0N6Q4z5e0k6Q4z5e0q4Q4c8e0N6Q4z5p5g2Q4b7U0m8Q4c8e0g2Q4z5f1y4Q4b7e0S2Q4c8e0N6Q4z5f1y4Q4z5f1k6Q4c8e0k6Q4b7f1c8Q4b7e0y4Q4c8e0k6Q4z5p5g2Q4z5p5y4Q4c8e0k6Q4z5p5k6Q4b7e0q4p5K9W2k6#2i4@1f1$3i4K6S2m8i4K6R3H3i4@1f1$3i4K6W2o6i4@1q4r3i4@1f1%4i4K6W2m8i4K6R3@1i4@1f1$3i4K6V1^5i4@1q4r3i4@1f1$3i4K6V1$3i4@1t1H3i4@1f1#2i4K6R3#2i4@1q4o6i4@1f1#2i4K6S2r3i4@1t1^5j5$3q4E0K9h3&6G2N6X3q4Q4c8f1k6Q4b7V1y4Q4z5p5y4U0k6h3I4S2M7Y4c8W2L8g2!0q4y4q4!0n7z5q4)9^5c8q4!0q4z5q4!0n7c8W2)9^5y4#2!0q4y4W2)9&6z5q4!0m8c8W2!0q4y4g2)9&6b7#2!0m8z5q4!0q4y4#2)9^5c8g2!0m8z5g2!0q4z5q4!0n7y4g2)9^5y4q4!0q4y4W2)9&6b7#2!0m8b7#2!0q4z5q4!0n7c8W2)9&6x3q4!0q4y4q4!0n7c8q4)9&6b7#2!0q4x3#2)9^5x3q4)9^5x3R3`.`.
最新版DjVu SDK也由caminova发行,但是在该公司的对外http网站(
ba5K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3y4S2L8h3W2F1L8%4k6S2i4K6u0W2K9Y4m8Q4x3V1k6W2L8W2)9J5c8W2!0q4c8W2!0n7b7#2)9^5z5g2!0q4y4q4!0n7z5q4)9^5b7g2!0q4y4W2)9^5z5g2!0n7c8g2!0q4y4q4!0n7z5q4)9^5c8q4!0q4y4g2)9^5z5q4!0n7x3q4!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4g2)9^5c8W2!0m8b7g2!0q4z5q4)9^5x3#2!0n7c8q4!0q4z5g2)9^5x3q4)9&6b7g2!0q4z5q4!0n7c8W2)9^5y4$3S2@1N6s2m8K6i4@1f1^5i4@1t1%4i4@1t1K6i4@1f1#2i4@1p5J5i4K6V1&6i4@1f1^5i4@1u0r3i4K6W2n7i4@1f1#2i4K6S2q4i4@1u0n7i4@1g2r3i4@1u0o6i4K6W2m8
d5bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2U0j5h3#2A6L8X3!0$3j5g2)9J5k6h3&6W2N6q4)9J5c8X3g2F1i4K6u0r3k6r3!0%4L8X3I4G2j5h3c8K6i4K6u0r3
还真是一堆不知所谓的公司啊……
三、玩DjVu的人
由于上述种种原因,DjVu在商用领域一直发不起来,但在某些地下扫描电子书界,却受到追捧。
追捧的原因很简单:地下扫描的电子书都需要通过互联网进行分享,因此对文件大小非常敏感,而且出于个人兴趣而去扫描电子书,要比拿钱完成扫描工作的更敬业,很少有低于300 DPI的,甚至鼓励用软件放大到600 DPI(详见《The Scan and Share tutorial》)。在这样高的分辨率下,字母文字用DjVu能获得极高的压缩率,有损JB2压缩出现错别字的概率也极小。
个人扫描电子书进行分享,当然不太可能去购买昂贵的商业DjVu软件,也不会在DjVu技术上花太多心思,所以我说是在“玩”DjVu。
俄罗斯的cracker世界闻名,据我所知“玩”DjVu玩得最出彩的也是俄罗斯的电子书界。而从我了解的情况看,俄罗斯cracker对DjVu SDK的兴趣不大,认为这个东东始终比商业软件慢个几拍,因此更热衷于使用商业DjVu制作软件,如果需要定制,也宁愿从最新版商业软件中摘取自己所需要的部分,最简单的例子就是DjVu Small。
受国外地下扫描电子书界影响,国内也有人跟风在玩DjVu。但是从我接触到的情况看,国内扫描电子书很少有能到300 DPI的,印刷、扫描效果也较国外差,在这种情况下采用有损JB2的影响目视可见。至于把16级灰度PNG格式的大图版PDG直接转换成DjVu,更是技术白痴的经典表现,我连笑话的心思都懒得起了。
四、小结
总之,在目前的情况下,向商业客户推荐采用DjVu格式保存扫描文档,算不上是一种很负责的行为,所以我最终劝那位从事扫描外包的老兄还是先等等看。
至于只是想“玩”,那就玩吧,注意保存好原始扫描格式就行,另外JB2尽量选无损压缩,插图或彩页的压缩比也别太狠。
当年列宁同志有个著名论断:出于贪婪的目的,资本家甚至会把用来绞死他们的绞索都买给我们。如果对DjVu片面追求压缩比,早晚也会往自己的脖子上亲手套一根绞索。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课