android pdf框架-7,白边切割

图片的切边操作有时是比较有用的.看着舒服多了,页面间的空白如果比较大的图片在显示上,需要缩放,缩放后通常滚动会有偏移.

这里先说算法思路.

列表与切边

在解析列表中每一页,先解析白边,得到后,再去解码图片,最终显示.

对于分块加载的处理就比较麻烦了.对于recyclerview中使用单页面一个图片还是相对容易的多的.

由于切边算昂贵的操作,可以缓存在内存中,甚至可以存储在文件中,下次读取pdf后,可以直接把切边的数据读出去.

切边法有两个操作

直接原图切边与缩略图切边

原图的好处就是切的准确度高,但太大,效率低.

缩略图的好处就是速度快,准确度略低.

普通切边法

将图片二值化,然后从左,上,右,下开始扫描,扫描后得到的白边范围.

缩略图切边法

先生成一张缩略图,比如200*200 范围内的,然后用上面的切边法,去把空白区算出来.然后再把缩略图与原图的比例,与切边后的rect计算出原图应该切多少.

切边优化

对于缩略图,有时还是太慢.一张图如果全扫描也要10毫秒,这不太能接受,尤其如果是在滚动过程中的切边,然后再渲染图片,10毫秒接近图片解码的一半时间了,整个切边到渲染图片到列表中将达到40毫秒左右,也不是不能接受,pdfium这个库比mupdf的解码也是慢这么多.

切边算法优化
二值化算法优化
二值化,0,1法

普遍的是使用像素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博客</

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/734919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网页设计中通过css在一个固定宽度的div容器中让一行超出的文本隐藏并省略掉

实现效果&#xff1a; 实现的关键css&#xff1a; overflow&#xff1a;hidden&#xff1b;这个表示超出容器的内容进行隐藏 white-space&#xff1a;nowrap&#xff1b;表示文本不断行显示 text-overflow&#xff1a;ellipsis&#xff1b;表示超出的部分用省略号进行表示 …

jar运行报错Unable to read meta-data for class

目录 一、场景描述 二、解决办法 1&#xff09;情况一 2&#xff09;情况二 贴一下部署报错堆栈信息&#xff1a; java.lang.IllegalStateException: Unable to read meta-data for class com.zhh.zhhd.biz.config.Test1Configat org.springframework.boot.autoconfigure.…

std::error::Error 和 std::io::Error 的区别和用法

std::error::Error 和 std::io::Error 在 Rust 中都是用于错误处理的类型&#xff0c;但它们各自有不同的用途和场景。 std::error::Error&#xff1a; std::error::Error 是一个 trait&#xff0c;它定义了错误处理的基本接口。这个 trait 通常由其他具体的错误类型实现&…

数字化转型导师坚鹏:科技创新产业发展研究及科技金融营销创新

科技创新产业发展研究及科技金融营销创新 课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不清楚科技创新产业的发展现状&#xff1f; 不知道科技金融有哪些成功的案例&#xff1f; 不知道科技金融如何进行营销创新&#xff1f; 课程特色&#xff1a; 以案例…

事务【MySQL】

稍等更新图片。。。。 事务的概念 引入 在 A 转账 100 元给 B 的过程中&#xff0c;如果在 A 的账户已经减去了 100 元&#xff0c;B 的账户还未加上 100 元之前断网&#xff0c;那么这 100 元将会凭空消失。对于转账这件事&#xff0c;转出和转入这两件事应该是绑定在一起的…

Spring-Cloud-Gateway Filter详细配置说明

Spring-Cloud-Gateway 常见Filter详细配置说明 gateway Filter官网:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories 概述&#xff1a; SpringMVC里面的的拦截器Interceptor&#xff0c;Servlet的过滤器。 “pre”和 “…

【刷题】Leetcode 415 字符串相加 和 34 字符串相乘

刷题 Leetcode 415 字符串相加题目描述 思路一&#xff08;模拟大法版&#xff01;&#xff01;&#xff01;&#xff09;Leetcode 34 字符串相乘题目描述 思路一&#xff08;模拟大法版&#xff09;Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&…

python 蓝桥杯之并查集

文章目录 总述合并过程查找过程算法实战实战1 总述 并查集&#xff08;Disjoint-set Union&#xff0c;简称并查集&#xff09;是一种用来管理元素分组情况的数据结构。它主要用于解决集合的合并与查询问题&#xff0c;通常涉及到以下两种操作&#xff1a; 合并&#xff08;Uni…

rtthread stm32h743的使用(七)dac设备使用

我们要在rtthread studio 开发环境中建立stm32h743xih6芯片的工程。我们使用一块stm32h743及fpga的核心板完成相关实验&#xff0c;核心板如图&#xff1a; 1.我们还是先建立工程 2.生成工程后打开mx进行配置&#xff0c;时钟配置如前所讲&#xff0c;不在赘述 3.更改mx文件…

只需要传实参的地址就能修改实参吗?以二级指针与一级指针为例,进行讲解

答案&#xff1a;不能&#xff01; 想要修改实参&#xff0c;需要两步&#xff1a; 1.传实参的地址 2.对实参的地址进行一次解引用 下面将以二级指针与一级指针为例&#xff0c;进行讲解&#xff1a; 目的:让a &#xff0c; b 的地址互换 void Swap(int** a, int** b) //二…

CSS常见用法 以及JS基础语法

CSS简介 首先我们要明白css对网页的页面效果就类似于化妆的效果,使得页面更好看 我们需要明白的就是CSS怎么使用即可 首先CSS的基本语法是<style></style>标签来修改 基本语法规范是选择器n条选择规范 例如 <style>p{color : red;} </style> 这里就是将…

【Linux系统】线程

目录 一.线程的概念 (1)地址空间是进程的资源窗口 (2)轻量级进程 二.线程的理解 1.Linux中线程的实现方案 2. 线程VS进程 3.线程比进程更加轻量化 4.线程的优点 5.线程的缺点 6.线程共享的资源 7.线程私有的资源 三.地址空间虚拟到物理的转化 1.页框 2.重新理解文…

HelpLook VS GitBook:知识库优劣详解

在信息爆炸的时代&#xff0c;企业要保持竞争优势&#xff0c;就必须善于管理和利用内部的知识资产。企业知识库作为一种集中存储和共享知识的工具&#xff0c;正在成为现代企业不可或缺的一部分。 HelpLook和Gitbook是提供专业知识库的两个平台&#xff0c;也被大众熟知。它们…

C++的一些基础语法

前言&#xff1a; 本篇将结束c的一些基础的语法&#xff0c;方便在以后的博客中出现&#xff0c;后续的一些语法将在涉及到其它的内容需要用到的时候具体展开介绍&#xff1b;其次&#xff0c;我们需要知道c是建立在c的基础上的&#xff0c;所以c的大部分语法都能用在c上。 1.…

C#MQTT编程10--MQTT项目应用--工业数据上云

1、文章回顾 这个系列文章已经完成了9个内容&#xff0c;由浅入深地分析了MQTT协议的报文结构&#xff0c;并且通过一个有效的案例让伙伴们完全理解理论并应用到实际项目中&#xff0c;这节继续上马一个项目应用&#xff0c;作为本系列的结束&#xff0c;奉献给伙伴们&#x…

DDT+yaml实现数据驱动接口自动化

前言 在之前的文章中我们知道了yaml文件可以进行接口自动化。除了yaml文件&#xff0c;Excel文档也可以用来编写自动化测试用例。 一定很想知道这两者有什么区别吧&#xff1f; 1、Excel使用简单&#xff0c;维护难&#xff0c;多种数据类型转换起来比较复杂 2、yaml学习稍…

Rust教程:How to Rust-变量

本文为第1篇 专栏简介 本专栏是优质Rust技术专栏&#xff0c;推荐精通一门技术栈的蟹友&#xff0c;不建议完全无计算机基础的同学 感谢Rust圣经开源社区的同学&#xff0c;为后来者提供了非常优秀的Rust学习资源 本文使用&#xff1a; 操作系统macOS Sonoma 14 / Apple M…

MySQL通过SQL语句进行递归查询

这里主要是针对于MySQL8.0以下版本&#xff0c;因为MySQL8.0版本出来了一个WITH RECURSIVE函数专门用来进行递归查询的 先看下表格数据&#xff0c;就是很普通的树结构数据&#xff0c;通过parentId关联上下级关系 下面我们先根据上级节点id递归获取所有的下级节点数据&#x…

Jenkins 节点该如何管理?

Jenkins 拥有分布式构建(在 Jenkins 的配置中叫做节点)&#xff0c;分布式构建能够让同一套代码在不同的环境(如&#xff1a;Windows 和 Linux 系统)中编译、测试等 Jenkins 的任务可以分布在不同的节点上运行 节点上需要配置 Java 运行时环境&#xff0c;JDK 版本大于 1.5 节…

代码随想录算法训练营第day16|104.二叉树的最大深度 559.n叉树的最大深度、111.二叉树的最小深度、 222.完全二叉树的节点个数

104.二叉树的最大深度 559.n叉树的最大深度在 这几道题完全可以用二叉树层序遍历做&#xff0c;具体实现参考上一篇文章代码随想录算法训练营第day15|二叉树层序遍历、 226.翻转二叉树 ●、101.对称二叉树 2-CSDN博客