图片的切边操作有时是比较有用的.看着舒服多了,页面间的空白如果比较大的图片在显示上,需要缩放,缩放后通常滚动会有偏移.
这里先说算法思路.
在解析列表中每一页,先解析白边,得到后,再去解码图片,最终显示.
对于分块加载的处理就比较麻烦了.对于recyclerview中使用单页面一个图片还是相对容易的多的.
由于切边算昂贵的操作,可以缓存在内存中,甚至可以存储在文件中,下次读取pdf后,可以直接把切边的数据读出去.
直接原图切边与缩略图切边
原图的好处就是切的准确度高,但太大,效率低.
缩略图的好处就是速度快,准确度略低.
将图片二值化,然后从左,上,右,下开始扫描,扫描后得到的白边范围.
先生成一张缩略图,比如200*200 范围内的,然后用上面的切边法,去把空白区算出来.然后再把缩略图与原图的比例,与切边后的rect计算出原图应该切多少.
对于缩略图,有时还是太慢.一张图如果全扫描也要10毫秒,这不太能接受,尤其如果是在滚动过程中的切边,然后再渲染图片,10毫秒接近图片解码的一半时间了,整个切边到渲染图片到列表中将达到40毫秒左右,也不是不能接受,pdfium这个库比mupdf的解码也是慢这么多.
普遍的是使用像素0与255,就是非0像素,白色的直接设置为255,0像素不变.这种方法容易识别图片产生错误.比如我解析三国演义的非扫描版pdf,它是带背景色为黄色的pdf,就无法正确识别它.
就是固定的阈值,比如100,小于它都设置0,大于都设置255.其它与上相同.
设置两个阈值,小于下限,大于上限设置0,在中间的设置255,其它同一法.
无论哪种,最终要的是能切好白边,实际中,二三两种会比较有优势.
当然解析时,mupdf已经不支持565的图片,pdfium这个还可以,用它可以略内存,直接忽略alpha通道了.
对于切边的二值化算法完成后.进入切边操作.
整个缩略图二值化后的图片直接从左,上,右,下,分别扫描,直到找到非白区,返回结果.
这种操作就是耗资源多点,因为已经是缩略图了,速度还是能接受的.
区域扫描法,这算不上什么算法,算是一种图片渲染策略,在上面的扫描方案基础上再优化.
比如一张图片,我最多切去2/3,那么我从左边向下扫描,可以设置扫描量最多是1/3,从右向左,最多1/3.那么左右方向可以省1/3的时间.
同理,上下扫描一样.
在上面的扫描方案中,不是事先准备好所有的二值化数据.针对的是缩略图原图操作
步骤:
从左开始,按行扫描,但一次扫描4行(多少行可修改),然后把这4行的数据进行二值化操作,然后确认空白区.如果是空白的,继续下一轮,直到扫扫描到非空白区.
其它方向同理.
二值化的只是部分区域,我扫到哪里就处理到哪里,可以省更多的时间,资源.
因为对整张图片二值化,也是耗时操作,很多页面没有必要这样处理,因为多数图片的内容区是有东西的.多数可能只扫描5行就得到了结果,剩下的100行都不要处理.尤其对于左,右,上这三边,可以省很多资源.对于下往上扫,就要看内容区多少了.
最终的耗时,从10毫秒减少到1毫秒.
这里借用一下别人的二值化文章,感谢.Android数字图像处理之二值化_android 图片二值化-CSDN博客