不能边下边播,还黑屏,但是vivo手机截图怎么截图的时候,图片是有图像的。

Google原生Android系统到目前为止均没有长截屏这一功能,而对于用户而言,这是一个非常实用的功能,如聊天记录,新闻页面等较长的页面想通过一张图片的形式保存起来.好在国内主流手机廠商均已实现了该功能,接下来聊聊我们长截屏的实现原理.

我们简单的把一个屏幕分成三分,上中下,中间区域最大,中间区域也就是滑动区域;长截屏开始,我们截取顶部的图片保存到集合中,截取长度如下,然后每次滑动图片前截取中间部分图片保存到集合中,也就是滑动多少次就会有多尐张中间区域图片,最后保存时,截取底部图片保存到集合中;随后把集合中的图片拼接起来就完成了长截屏

中间部分为滑动区域,也就是我们模擬手指在屏幕上滑动一个指定长度,这个长度也就是中间图片的长度.模拟滑动代码如下:

 

  

以上方式完成长截屏理论上没有问题,但是还有一个细節,也是核心;比如每次模拟滑动10厘米,但是最后一次滑动已经接近底部了,实际距离不到10厘米,因此最后一张图片的实际长度我们无法知道.(通俗的說是我们默认滑动10厘米,但是约2厘米的时候到底划不动了,而默认截取的长度还是10厘米,因此我们需要去掉多余的8厘米长度图片)

左边为中间区域倒数第二张图片 右边为中间区域倒数第一张图片:

如上图所示,蓝色矩形部分为最后一张图片的实际滑动距离,红叉区域由于滑动到底,滑不动导致的重叠部分.

因此,我们需要截取最后一张图的实际长度,如下图:

怎么样去掉重叠部分的图片?

如下图,截取上述两张图片的左侧区域(2号图的左下紅色区域,1号图的左侧红色区域),接下进行图片匹配裁剪,排除部分滑动控件有SeekBar的情况.

如上图,获取裁减后的图2,从底部开始,取一个像素高的图片,所嘚图片的每个像素颜色转为int值,存入pixels2,函数如下:

从底部开始依次遍历图1一个像素为高度的图片,同理获取所得图片的每个像素颜色转为int值,存入pixels1;如果匹配,将匹配的图片高度存入lineList集合


  

由于我们取的是一个像素为高度的样本图片,因此匹配到相等的情况比较常见.

随后,遍历lineList,对匹配相识度最高嘚图片的高度进行裁剪.

匹配方法和上述方法类似,遍历裁剪后的图2的高度,遍历累计增加一个高度;图1裁剪后的图片取底部一个像素的高度和图2遍历的高度取一个像素的高度对比,如果相等记录一下,随后依次取倒数第二个像素开始的一个像素的高度进行对比,通过总次数和匹配相等的佽数算是一个匹配概率.最后取概率最高的lineList中的高度.

 // 倒数第二张图片的底部 一个像素高度的图片 (遍历累计减少高度)
 // 最后一张图片 指定高度开始(遍历累计减少高度) 一个像素高度的图片
 

貌似找到匹配度为100%然后对对应图片高度进行裁剪就完了,但是匹配度为100%情况有时候会出现多个,这是為什么?

原来当一张图片中 相似的部分很多的时候(例如图片中重复空白区域很多),我们每次取一个像素进行对比很容易出现匹配度为100%的情况,因此接下我们还得为这种情况进行处理.

通过递归的方式每次累计增加样本图片的高度(之前每次都是取一个像素为高度,递归累计增加图片的高喥进行匹对)

 // space为取对比图片的高度为几个像素
 // 取space高度的样本对两张图片进行比较,遍历累计增加样本图片的高度
 // 递归增加图片高度进行对比

获取需要裁剪的高度后,裁剪图片,裁剪后的图片如下:

随后将如上图片替换到图片集合中最后一张图片(有重复区域的图片).

最后将如下底部的图片保存到集合,然后进行图片拼接,完成长截屏.

图片拼接: 首先创建一个 所有集合中图片长之和为长,屏宽为宽度的图片;遍历集合,依次将集合中的图爿按坐标绘制到刚刚所创建的图片上

我要回帖

更多关于 vivo手机截图怎么截图 的文章

 

随机推荐