美文网首页走进android
客户端如何保证图片中人脸不被裁剪

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

作者: brzhang | 来源:发表于2016-03-24 11:55 被阅读263次

    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)

    从后台的角度:

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

    优化后

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

    相关文章

      网友评论

        本文标题:客户端如何保证图片中人脸不被裁剪

        本文链接:https://www.haomeiwen.com/subject/stjrlttx.html