KVNBoundedImageView 1.0.0

KVNBoundedImageView 1.0.0

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最后发布2014年12月

Kevin Donnelly维护。



KVNBoundedImageView 旨在在 UIImageView 中尽量保持面部可见和居中。它旨在易于使用并易于扩展用于不同类型的图像检测。

Disabled ImageViewEnabled

具有可配置的检测速度、操作队列、缓存以及利用 UIImageView 优化的图像渲染(此处没有自定义绘制),KVNBoundedImageView 旨在尽可能快,在不阻塞主线程需要做重负载工作时.

用法

KVNBoundedImageView 尽量监视 UIImageView 属性中尽可能多的更改,并相应地做出反应以保持特征可见。然而,如果在任何时间发现视图未对更改做出响应,您可以手动强制调用 fitToFeature 来更新它。有关所有下面的示例的更多信息,请参阅示例项目

从 NIB 或 Storyboard 创建

将 UIImageView 拖动到场景中,并在身份检查器的实用程序窗格中将类更改为 KVNBoundedImageView。您可以通过设置 nibImageCacheName 和 NSString 值来自定义运行时属性中的重用缓存名称。

Utility Pane screenshot

编程式创建

最少配置

KVNBoundedImageView *imageView = [[KVNBoundedImageView alloc] initWithFrame:aRect];
[imageView setImage:[UIImage imageNamed:@"test"] cacheName:@"test"];

[imageScrollView addSubview:imageView];

一些配置

在进行自定义配置时,建议您在设置要检测的图像之前设置所有参数。否则,检测和裁剪将开始,然后将立即取消并重新启动。

KVNBoundedImageView *imageView = [[KVNBoundedImageView alloc] initWithFrame:aRect];
[imageView setBoundingBoxScheme:BoundingBoxSchemeLargest];
[imageView setBoundingPadding:10.0];
[imageView setImage:[UIImage imageNamed:@"test"] cacheName:@"test" placeholder:[UIImage imageNamed:@"placeholder"]];

[imageScrollView addSubview:imageView];

从URL加载

KVNBoundedImageView *imageView = [[KVNBoundedImageView alloc] initWithFrame:aRect];    
[imageScrollView setImageFromURL:aURL cacheName:@"test" placeholder:[UIImage imageNamed:@"placeholder"]];

属性

  • boundingPadding: CIDetector 对额头有一定抵制,它不会将它们包含在检测界限内。如果你大概知道你图像中人脸的大小,或者如果你在图像顶部(或下巴底部)被切掉的前额(或者说下巴)有困难,使用这个值可能会给你更好的结果。但这不是一门完美的科学,边缘情况无处不在!
  • detectorAccuracy: 改变用于特征检测的 CIDetectorAccuracy。默认是 CIDetectorAccuracyLow
  • boundingBoxScheme: 如何计算边界矩形。
    • BoundingBoxSchemeAll: 使用所有检测到的特征。创建一个适合所有特征的矩形并使用它。这是默认行为
    • BoundingBoxSchemeLargest: 使用找到的最大人脸。如果您的图像是人群图像且有一个明显的主题,这很好。
    • `BoundingBoxSchemeSmallest': 使用找到的最小人脸。坦白说,我之所以加点这,只是因为它很容易实现。我不知道为什么你想用这个。也许是因为每个人都喜欢那些处于劣势的人?
  • boundingEnabled: 启用或禁用检测和边界。如果是 NO,则使用 UIViewContentModeScaleAspectFill 显示图像
  • animated: 为了使过渡更加平滑(但也仅仅如此,还有改进的空间),当检测完成后提供了一个短的Core Animation(kCATransitionFade)。默认为 YES

安装

要手动安装KVNBoundedImageView,将KVNBoundedImageView.m和KVNBoundedImageView.h文件添加到您的项目中。将CoreImage框架导入到您的项目中。

Podfile

platform :ios, '7.0'
pod "KVNBoundedImageView",

要求

  • CoreImage
  • iOS 5.0+

扩展KVNBoundingImageView

这个库设计时考虑了可扩展性。实现自己的检测相当容易,只要你自己做实际的检测工作(比如难关)。也许你已经用 OpenCV 写了一个狗检测器,并想创建一个专注于狗的应用,而不要有讨厌的猫打扰(一个崇高的使命)。为了实现这一点,你只需要在子类中实现 boundingRectangleForImage 并返回你希望可见的 CGRect。这个矩形需要在使用 UIView 坐标系(原点在左上角)。请注意,boundingRectangleForImage 可能在一个后台队列上被调用,因此不应执行任何线程不安全的操作。为了方便使用你的子类的开发者,你应该也扩展 foundFeatures 并返回在图像中检测到的所有矩形(存储在 NSValue 中)。

关于优化和缓存的说明

这个库使用NSCache存储裁剪的图像以实现快速召回。键使用了提供的缓存名称以及检测精度、边界框方案和当前视图宽高比。这样图像就不会在不会正确适应的视图中被重用。NSCache会响应OS级内存警告来清除空间,但如果你担心内存使用,请尽量减少你使用的不同配置,或者只需使用 setImage: 或传递空缓存名称,就不会进行缓存。这个缓存旨在用于表格视图,但它还没有被广泛测试,因此请谨慎使用。

内存使用

这个库使用的内存比人们想象的要多,主要集中在CIDetector的使用上。CIDetector似乎存在内存无限增长的问题。不是重复使用检测器,而是在需要时实例化,这可以缓解这个问题,但似乎还不能完全消除。关于这个问题的OpenRadar

动画

当imageview的宽高比改变时,需要重新裁剪图片,所以当动画变换边界(中心、原点是可以的)时启用这个组件可能不是最好的主意。推荐的方式

UIImage *originalImage = imageView.originalImage;
UIImage *croppedImage = imageView.image;

[imageView setBoundingEnabled:YES];
[imageView setImage:croppedImage];
[UIView animateWithDuration:1.0 animations:^{
    // Mess with bounds
} completion:^(BOOL f) {
    [imageView setImage:originalImage cacheName:@"cacheName"];
    [imageView setBoundingEnabled:YES];
}];

作者

Kevin Donnelly - @donnellyk

许可

KVNBoundedImageView在MIT许可下可用。有关更多信息,请参阅LICENSE文件。

示例照片

所有示例照片均从Flickr提供的创意共享许可下获得。感谢Thomas SaitoFrankiAbleman