概述

所谓智能裁剪其实就是按照指定尺寸裁剪或显示出包含图片核心特征的区域,目前很多智能裁剪都是在服务器端做的,在客户端需要访问时直接裁剪放到Redis或者提前裁剪好以备访问。但是找了一圈直接在iOS客户端进行裁剪的库还不多,或者使用成本比较高,不能即拿即用。但是有时候客户端可能并非直接从服务器端获取数据而是读取相册数据,不可能先把图片存放到服务器端裁剪然后再拿来用,考虑到这种场景也不再少数,因此就有必要思考一套客户端智能裁剪的方案。

免费好用的智能裁剪库

最近两天整理了之前开发一个软件过程中自己开发的一个客户端智能裁剪库供有需要的同学使用,当然后面有时间的话会整理开源。说是库本质就是一套算法而已,但是在编写这套算法期间也参考评估过很多已有或者想要使用而没有使用的解决方案。

首先说一下目前在网上比较容易找到的一些库存在的问题:

  • 没有iOS对应的版本,集成起来极其复杂,之前为了用一个不错的库甚至在iOS调用Python库
  • 速度慢,生成一张智能裁剪后的图片需要1s左右,不再可容忍范围之内
  • 人像识别不准确,图片中占比较小的人脸识别不出来,甚至有可能出现误识别(这个其实比识别不出来问题还大)
  • 基于专利收费算法实现(例如使用SRUF),不仅开发者使用起来要引用大量的库而且有收费风险
  • 集成比较麻烦,使用起来光配置环境就要摆弄半天,还不一定能成功

当然,事实上在探索过程中也走了不少的弯路,遇到的问题要比上面多得多,包括有些算法只能裁剪横图,对于宽高比较小的竖图支持很差,又或者引入大量的库造成app本身大小直线上升等等。。。因此这也就是为什么自己要开发一个新的库SmartCrop.framework而不是基于现有库来做的原因。

那么SmartCrop.framework智能裁剪库又有什么特点呢:

  • 跨平台,当然既然作为一个iOS开发者一定要包含iOS版本(尽管此文中只提供了iOS版本,不过其实这个库本身基于c++实现,天然具有跨平台特性,后续有时间也会整理其他平台的版本)
  • 速度快,几乎可以做到实时裁剪

    iOS客户端图片智能裁剪的更多相关文章

    1. iOS 设置图片imageView圆角——对图片进行裁剪

      以前设置图片圆角总是把imageView设置成圆形,然后设置maskToBounds为YES,其实这样处理很消耗性能,图片多了之后比较卡,最好将图片进行裁剪后显示:这里有个分类可以用: UIImage ...

    2. iOS实现图片裁剪功能,基于TKImageView完善与讲解

      1.功能需求:需要实现图片区域裁剪功能. 2.效果图:     3.实现原理:本来想自己实现的,刚好看到一个比较好的库:TKImageView,下载好研究了下,发现基本都能满足我的需求,而且封装的也比 ...

    3. 开源中国iOS客户端学习

      开源中国iOS客户端学习 续写前言 <开源中国iOS客户端学习>续写前系列博客    http://blog.csdn.net/column/details/xfzl-kykhd.html ...

    4. 【HELLO WAKA】WAKA iOS客户端 之一 APP分析篇

      由于后续篇幅比较大,所以调整了内容结构. 全系列 [HELLO WAKA]WAKA iOS客户端 之一 APP分析篇 [HELLO WAKA]WAKA iOS客户端 之二 架构设计与实现篇 [HELL ...

    5. IOS客户端Coding项目记录导航

      IOS客户端Coding项目记录(一) a:UITextField设置出现清除按键 b:绘画一条下划线  表格一些设置 c:可以定义表头跟底部视图(代码接上面) d:隐藏本页的导航栏 e:UIEdge ...

    6. iOS客户端的在线安装和更新——针对ADHoc证书

      这篇文章纯给自己留个备份,所以对AdHoc证书内部分发和对iOS客户端开发不了解的请直接无视. 一般在iOS游戏或应用开发过程中,正式发布到App Store之前,都需要内部的测试,客户端的安装是个不 ...

    7. 一秒钟生成自己的iOS客户端

      原谅我这个标题党 想当年我也是亲自学过几天Objective-c的程序猿,我一眼就知道我是在骗人,但那有怎样呢!还不是满大街都是各种<十分钟让你明白Objective-C的语法>.< ...

    8. 新浪微博iOS客户端架构与优化之路

      新浪微博iOS客户端架构与优化之路   随着Facebook.Twitter.微博的崛起,向UGC.PGC.OGC,自媒体提供平台的内 容消费型App逐渐形成了独特的客户端架构模式.与电商和通讯工具类 ...

    9. 蘑菇街iOS客户端应用源码

      蘑菇街iOS客户端应用源码 随着蘑菇街由导购向电商转型,蘑菇街自己的IM也应运而生,IM起初只是用于商家和买家之间沟通的工具.后面我们问自己,既然已经有了用于客服的IM,为什么不自己做一个IM,用于公 ...

    随机推荐

    1. springMVC引入Validation详解

      本文简单介绍如何引入validation的步骤,如何通过自定义validation减少代码量,提高生产力.特别提及:非基本类型属性的valid,GET方法的处理,validation错误信息的统一re ...

    2. OAuth 2 Developers Guide

      Introduction This is the user guide for the support for OAuth 2.0. For OAuth 1.0, everything is diff ...

    3. DUBBO报错分析—1(连接zookeeper成功,调用方法无反应,不报错)

      思路分析 调用方法时,最后调用执行的是mapper的sql语句,既然调用对应的方法无法获取返回值,多是sql错误,但是并未报sql错误,说明可能是与sql相关的数据源配置错误. 过程调试 经尝试,当直 ...

    4. 基于opencv3.0和下的条形码与二维码识别

      其中对条码与二维码的识别分为以下4个步骤 1. 利用opencv和Zbar(或者Zxing)对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. 2 ...

    5. ResultSet,RowSet,OracleCachedRowSet和RowSetMetaData区别及联系

      在java主要涉及到数据开发的过程中,我们会和数据库打交道很多,其中使用了数据集比如ResultSet和RowSet,经常使用两种,还有其它的一些,那么这两种的主要区别是什么呢?我们先来看它们引入的方 ...

    6. MyBatis 中一对一和一对多的映射关系

      1 一对一映射 比如每位学生有一个地址. public class Address { private Integer addrId; private String street; private S ...

    7. 【链表】Bzoj1098[POI2007]办公楼biu

      Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决 ...

    8. BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树

      BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树 题意: 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastan ...

    9. Postman-----构建工作流程(用于某个请求完成后从指定的请求开始继续运行)

      使用场景: 当您开始运行某个集合时,所有的请求按照您在主程序中看到的顺序运行,但是在某些情况下,往往我们希望按顺序列出的请求A.B.C.D.E.F请求,在执行时不执行B.C请求,希望A请求完成后直接执 ...

    10. MySQL 复制 - 性能与扩展性的基石 4:主备切换

      一旦使用 MySQL 的复制功能,就很大可能会碰到主备切换的情况.也许是为了迭代升级服务器,或者是主库出现问题时,将一台备库转换成主库,或者只是希望重新分配容量.不过出于什么原因,都需要将新主库的信息 ...