Xamarin Android:ContentResolver无法获取可查找流的TIFF保存问题及解决
Xamarin Android:LibTIFF保存大TIFF到SD卡的流兼容问题解决
问题背景
- 需求:在Xamarin Android应用中实现将TIFF图片保存到SD卡,依赖LibTIFF库处理TIFF文件,该库要求传入的
Stream必须支持读写操作和**随机定位(Seek)**功能 - 遇到的障碍:
- 通过
DocumentFile.CreateFile创建SD卡文件后,调用ContentResolver.OpenOutputStream获取的流仅支持单向输出,不支持Seek、Position等定位操作,无法满足LibTIFF的要求 - 无法使用
MemoryStream替代,因为部分TIFF图片体积过大,会导致内存溢出 - 尝试自行封装
OpenOutputStream和OpenInputStream实现可查找流,但存在输入输出流同步不一致的问题
- 通过
解决方法
通过Java NIO Channel实现可定位的Stream,再结合BufferedStream优化性能,具体步骤:
- 从
ContentResolver获取的输出流中提取对应的Java Channel对象 - 基于Channel实现自定义的
Stream子类,重写Seek、Position等方法,通过Channel的定位能力实现流的随机访问 - 将自定义的可查找流用
BufferedStream包装后,传入LibTIFF的接口,即可满足其对可读写、可定位流的需求
内容的提问来源于stack exchange,提问作者gram
相关产品推荐
相关产品推荐

