走进android

客户端如何保证图片中人脸不被裁剪

2016-03-24  本文已影响263人  brzhang

CenterCrop模式解决的就是:
1. 图片要去两头,留中间 ,锚点相当于在(0.5,0.5),锚点范围--》(0f, 0f) 是左上对齐显示,(1f, 1f) 是右下角对齐
2. 图片要填充满控件
因此对于一些有人物的图片,可能会使得人脸被截断,用户体验不是很好,就是下面这幅图的效果:


优化前

那么有没有一些解决方案呢:答案当然是有的。

从客户端的角度来思考问题:

1、假如借助一些类库,我们可以识别出人脸所在位置。如果可以设置以人脸位置居中裁剪显示,那么效果会好很多,假设,我们有这种成熟的方案。
2、使用focusCrop,要使用这个,你需要使用到一个库fresco。这样,我们就可以对图片任意的锚点进行“CenterCrop”了

那么用代码描述就是:

首先在 XML 中指定缩放模式:
fresco:actualImageScaleType="focusCrop"

在Java代码中,给你的图片指定居中点:

PointF focusPoint;// your app populates the focus 
pointmSimpleDraweeView.getHierarchy() .setActualImageFocusPoint(focusPoint);

那么问题的中心归结到,我们如何去找这个人脸的位置,然后把他转化为锚点,比如(0.3,0.2),
然后问题就结了。
那么,有没有方案呢?当然也是有的 :
1、androd sdk自带着FaceDetector,是可以使用的。
2、opencv也提供了人脸检测的android库[opencv]
(http://opencv.org/platforms/android/opencv4android-samples.html)

从后台的角度:

后台可以对用户上传的图片进行人脸识别,裁剪出一个已人脸为中心的图,重新生成一个链接作为封面图片给客户端使用,当然,这种方式绝对是应该被推崇的,因为后台的处理性能用户不是直接感知的,然而,如果这些图片处理的工作放在前台,虽然是在后台线程做,但是也是很影响的,起码,对用户的电量,流量方面来说,是一个硬伤。

优化后

当然,这个并不是最终结果,实际上,我这段时间并没有空来研究如何找出人脸的位置,并且转换为锚点来,等以后有空再做。

上一篇下一篇

猜你喜欢

热点阅读