前10篇文章,9章关于pdf的,pdf解析后,里面也是有各种图片,于是利用pdf的view来展示图片,似乎也是个不错的想法.
android手机中的图片查看功能,有的可以展示,有的不能.比如华为,荣耀对大体积的png是可以显示的,小米是不显示,只有缩略图.
一张png50m大,比如清明上河图,原图是tiff,2g左右,这是adobe收购公司发明的,也是ps常用的.
对于tiff,华为,小米都显示不了,一方面可能是太大了,我有两张,一张300多m,一张2g,还有一张600多清明上河图原图扫描版的缩略图.
查阅了不少关于tiff的解析,目前没有提供好的android可以直接用的so库或lib库,TiffBitmapFactory有一个解析版,比较老了,它解析每次都是从头解析,虽然有area,但还是不行,对于300m的图片,解析一次要7s多,不管这块是多大,就算只有100*100像素也是如此.
tif库4.1.0才支持按需加载,我还没有实现这个功能,它是链表存储的,解析每一块,要从头开始查询fd的位置.
mupdf里面有一个load-tiff.c的解析代码,每一次加载也是7s左右,后面的就不用了,于是就想到,我把它直接展示不就行了.
原来的apk已经具备了查看图片的功能,但对于pdf的view来显示图片,有几个不好的方面:
- 手势,pdfview目前不支持双击放大这些操作,是针对pdf的手势.
- 缩放比例,当前没有设置很大的比例.
- 加载速度,不支持多线程,mupdf的问题,暂时没有处理.
加载大图用的是subsampling-scale-image-view,这个在github上比较有名,它具备tile的按块加载,只需解码的时候 实现regiondecoder就可以了.
而且写的很好,文档注释很全.
代码:
要实现两个类,一个是pooled的解码类,一个是普通的解码.它首先会先用pooled类,去检测高与宽.
public class MupdfPooledImageRegionDecoder implements ImageRegionDecoder
public class MupdfImageDecoder implements ImageDecoder
官方的解码skia有三个类,这里不需要,两个就够了.
首先,对于体积超过10m的图片,获取exif可能会有内存不足的问题,所以subsampling-scale-image-view的源码,把相关获取exif的去了,去了以后,有些图片的方向不对,手机转一下就可以了.目前没有好的解决方案,这只是对于三星手机拍的照片有这个问题.
图片展示要分两类,一类是android支持的各种图片,一类是tiff.因为tiff通常是比较大的.比如地图,星空,航天这些领域.
具体实现:
if (path!!.endsWith("tif") || path.endsWith("tiff")) {
binding.imageView.setBitmapDecoderFactory(
CompatDecoderFactory(
MupdfImageDecoder::class.java,
Bitmap.Config.ARGB_8888
)
)
binding.imageView.

最低0.47元/天 解锁文章
1435

被折叠的 条评论
为什么被折叠?



