概述

开源项目名称:HYBImageCliped
当前版本:2.0.0
项目用途:可给任意继承UIView的控件添加任意多个圆角、可根据颜色生成图片且可带任意个圆角、给UIButton设置不同状态下的图片且可带任意圆角、给UIImageView设置任意图片,支持带圆角或者直接生成圆形。上述功能都不会造成离屏渲染。

版本变化

Version 2.0.0

  • 将UIImageView扩展中的API全部移至UIView扩展,这样可以直接使用更轻量的UIView来显示图片,而不需要UIImageView。同时还可以兼容使用UImageView的同学
  • 增加几个方便生成图片的API
  • 新增图片添加边框功能

效果如下:

详情查看:Version2.0.0新增API

Version 1.1.1

  • fix bug
  • 优化内存

Version 1.1.0

  • 增加剪裁的图片缓存管理类HYBImageClipedManager,用于解决缓存到内存引起内存增长很快的问题。详情查看HYBImageClipedManager

Version 1.0.1

  • fix文档未上传的bug
  • 去掉不相关的注释
  • 增加demo

Screenshot

裁剪花费的时间

正常图片裁剪所花费的时间是挺小的,但是当图片过大时,花费时间也会越多。但是,裁剪前滚动列表是非常明显地卡,裁剪后滚动是明显的流畅。对于图片列表这个demo中,裁剪后FPS能平均在58左右,基本没有感觉到卡。

如何使用

在使用之前,先引入头文件:

 
1
2
3
 
#import "HYBImageCliped.h"
 

HYBImageClipedManager

此类用于处理图片缓存到本地,解决内存增长问题。只有以下几个API,分别是读取图片、存储图片、获取缓存大小、清空缓存:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
/**
*  根据存储时指定的key从本地获取已剪裁好的图片
*
*  @param key  通常是URL。在内部会进行MD5
*
*  @return 从本地读取图片,不会存储到内存中,用于解决图片列表中内存暴涨问题
*/
+ (UIImage *)clipedImageFromDiskWithKey:(NSString *)key;
 
/**
*  在裁剪成功后,可以调用此API,将剪裁后的图片存储到本地。
*
*  @param clipedImage  已剪裁好的图片
*  @param key                  唯一key,通常是指URL。内部会进行MD5.
*/
+ (void)storeClipedImage:(UIImage *)clipedImage toDiskWithKey:(NSString *)key;
 
/**
*  获取本地已存储的所有已剪裁的缓存大小,单位为bytes
*
*  @return 缓存大小
*/
+ (unsigned long long)imagesCacheSize;
 
/**
*  清除缓存
*/
+ (void)clearClipedImagesCache;
 

UIImage+HYBImageCliped

目前提供了以下几种类型的API:

  • 根据颜色生成图片,支持带任意圆角
  • 单纯地放大或者缩小图片
  • 直接生成带四个圆角的图片
  • 生成带任意圆角的图片
  • 直接生成圆形图片

2.0.0新增:增加添加图片边框属性

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
#pragma mark - 边框相关属属性,仅对生成圆形图片和矩形图片有效
/**
*  默认为1.0,当小于0时,不会添加边框,仅对生成圆形图片和矩形图片有效
*/
@property (nonatomic, assign) CGFloat hyb_borderWidth;
/**
*  当小于0时,不会添加边框。默认为0.仅对生成圆形图片和矩形图片有效
*/
@property (nonatomic, assign) CGFloat hyb_pathWidth;
/**
*  边框线的颜色,默认为[UIColor lightGrayColor],仅对生成圆形图片和矩形图片有效
*/
@property (nonatomic, strong) UIColor *hyb_borderColor;
/**
*  Path颜色,默认为白色。仅对生成圆形图片和矩形图片有效
*/
@property (nonatomic, strong) UIColor *hyb_pathColor;
 

根据颜色生成图片

下面是注释去掉后的API,可以根据颜色生成指定大小的图片,也可以设定生成带圆角的图片,当有圆角时,可以指定背景颜色,以处理图层混合问题:

 
1
2
3
4
5
6
7
8
9
10
 
+ (UIImage *)hyb_imageWithColor:(UIColor *)color toSize:(CGSize)targetSize;
 
+ (UIImage *)hyb_imageWithColor:(UIColor *)color toSize:(CGSize)targetSize cornerRadius:(CGFloat)cornerRadius;
 
+ (UIImage *)hyb_imageWithColor:(UIColor *)color
                         toSize:(CGSize)targetSize
                   cornerRadius:(CGFloat)cornerRadius
                backgroundColor:(UIColor *)backgroundColor;
 

单纯放大或者缩小图片

这里注释已去掉,参数一是放大或者缩小图片至targetSize,参数二是表示是否要等比例放大或者缩小。当图片的宽、高比与targetSize的宽、高比差不多时,可以使用等比例;当相关很大时,如果使用等比例,将看不到一部分内容。

 
1
2
3
4
 
- (UIImage *)hyb_clipToSize:(CGSize)targetSize
               isEqualScale:(BOOL)isEqualScale;
 

直接生成带四个圆角的图片

当有圆角时,默认背景颜色为白色。为了解决图层混合所带来的性能问题,若白色与控件的背景颜色不一样,请手动指定背景颜色,以生成最适合场景的图片:

 
1
2
3
4
5
6
7
8
9
10
11
 
- (UIImage *)hyb_clipToSize:(CGSize)targetSize
               cornerRadius:(CGFloat)cornerRadius
            backgroundColor:(UIColor *)backgroundColor
               isEqualScale:(BOOL)isEqualScale;
/**
* 生成带圆角图片,默认为白色背景、isEqualScale为YES
*/
- (UIImage *)hyb_clipToSize:(CGSize)targetSize
               cornerRadius:(CGFloat)cornerRadius;
 

生成带任意圆角的图片

图片也可以生成带任意圆角的,比如要生成上左、上右这两个圆角,可以这么写UIRectCornerTopLeft | UIRectCornerTopRight,中间直接使用 | 来连接即可:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
 
- (UIImage *)hyb_clipToSize:(CGSize)targetSize
               cornerRadius:(CGFloat)cornerRadius
                    corners:(UIRectCorner)corners
            backgroundColor:(UIColor *)backgroundColor
               isEqualScale:(BOOL)isEqualScale;
/**
* 生成任意带圆角的图片,默认为白色背景,isEqualScale=YES
*/
- (UIImage *)hyb_clipToSize:(CGSize)targetSize
               cornerRadius:(CGFloat)cornerRadius
                    corners:(UIRectCorner)corners;
 

直接生成圆形图片

在App中有很多是要显示成圆形的,因此使用下面的API来直接生成圆形图片是很方便的:

 
1
2
3
4
5
6
7
8
9
 
- (UIImage *)hyb_clipCircleToSize:(CGSize)targetSize
                  backgroundColor:(UIColor *)backgroundColor
                     isEqualScale:(BOOL)isEqualScale;
/**
* 生成圆形图片,默认为白色背景、isEqualScale为YES
*/
- (UIImage *)hyb_clipCircleToSize:(CGSize)targetSize;
 

UIButton+HYBImageCliped

对于UIButton,目前提供了两种API:

  • 根据状态设置图片
  • 根据状态设置背景图片

根据状态设置图片

这两个API只差一个参数targetSize,如果控件已经是明确的大小,可以直接使用不带targetSize参数的API。如果控件大小在设置图片前不确定,请手动明确指定要生成的图片的大小:

 
1
2
3
4
5
6
7
8
9
10
11
12
 
- (void)hyb_setImage:(id)image
            forState:(UIControlState)state
              cornerRadius:(CGFloat)cornerRadius
              isEqualScale:(BOOL)isEqualScale;
 
- (void)hyb_setImage:(id)image
            forState:(UIControlState)state
              toSize:(CGSize)targetSize
        cornerRadius:(CGFloat)cornerRadius
        isEqualScale:(BOOL)isEqualScale;
 

根据状态设置背景图片

按钮是只可以有多种状态的,可设置图片,自然也可设置背景图片:

 
1
2
3
4
5
6
7
8
9
10
11
12
 
- (void)hyb_setBackgroundImage:(id)image
                      forState:(UIControlState)state
                  cornerRadius:(CGFloat)cornerRadius
                  isEqualScale:(BOOL)isEqualScale;
 
- (void)hyb_setBackgroundImage:(id)image
                      forState:(UIControlState)state
                        toSize:(CGSize)targetSize
                  cornerRadius:(CGFloat)cornerRadius
                  isEqualScale:(BOOL)isEqualScale;
 

UIView+HYBImageCliped

支持给任意视图添加带任意个圆角。使用起来也非常简单,看注释中的API介绍,带有小例子。如果有多个圆角,通过UIRectCornerTopLeft |UIRectCornerBottomRight这样来设置,中间用 | 连接,表示按位与的意思:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
/**
*  给控件本身添加圆角,不是通过图片实现的。
*
*  @param corner             多个圆角可通过UIRectCornerTopLeft | UIRectCornerTopRight这样来使用
*  @param cornerRadius 圆角大小
*
*  @Example            
*  [cornerView3 hyb_setImage:@"bimg8.jpg" cornerRadius:10 rectCorner:UIRectCornerTopLeft |UIRectCornerBottomRight isEqualScale:NO onCliped:^(UIImage *clipedImage) {
      // 如果需要复用,可在异步剪裁后,得到已剪裁后的图片,可另行他用
   }];
*/
- (void)hyb_addCorner:(UIRectCorner)corner cornerRadius:(CGFloat)cornerRadius;
 
/**
* corner为UIRectCornerAllCorners
*
* @Example  
* 添加一个圆角:[view1 hyb_addCorner:UIRectCornerTopLeft cornerRadius:10];
*/
- (void)hyb_addCornerRadius:(CGFloat)cornerRadius;
 

UIImageView+HYBImageCliped

2.0版本之后,已经添加至UIView+HYBImageCliped

这里提供的API也有好几种,与UIImage+HYBImageCliped有点类似:

  • 将图片裁剪成指定大小(只是单纯地缩放)
  • 直接生成圆形图片控件
  • 生成四个带圆角图片来填充
  • 生成任意圆角图片来填充

每个API后面都带有一个闭包回调,在剪裁完成时,会回传,外部可以根据需求处理。因为裁剪是异步去处理的,所以只好通过闭包回调!

将图片裁剪成指定大小(只是单纯地缩放)

如果不需要添加任何圆角,只是想解决图片过大,与控件本身相差太大而千万像素不对齐的问题,可以直接使用下面的API:

 
1
2
3
4
5
6
7
 
- (UIImage *)hyb_setImage:(id)image size:(CGSize)targetSize isEqualScale:(BOOL)isEqualScale onCliped:(HYBClipedCallback)callback;
/**
* 使用指定的图片来填充图片。对于在填充图片之前,肯定有控件大小的,可以直接使用些API。
*/
- (UIImage *)hyb_setImage:(id)image isEqualScale:(BOOL)isEqualScale onCliped:(HYBClipedCallback)callback;
 

直接生成圆形图像

在开发中,有很多是直接显示圆形头像、圆形图片的,下面的API可以直接生成:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
 
- (UIImage *)hyb_setCircleImage:(id)image
                           size:(CGSize)targetSize
                   isEqualScale:(BOOL)isEqualScale
                       onCliped:(HYBClipedCallback)callback;
/**
*  使用指定的图片来填充,但是生成的是圆形图片,默认背景颜色为白色。当调用此API时,若控件本身
*  已经有确定的大小,则可以直接使用此API
*/
- (UIImage *)hyb_setCircleImage:(id)image
                   isEqualScale:(BOOL)isEqualScale
                       onCliped:(HYBClipedCallback)callback;
 

生成四个带圆角图片来填充

如果显示带四个圆角,可以直接使用下面的API,高效生成带圆角的且与控件大小一致的图片来填充:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
- (UIImage *)hyb_setImage:(id)image
                     size:(CGSize)targetSize
             cornerRadius:(CGFloat)cornerRaidus
          backgroundColor:(UIColor *)backgroundColor
             isEqualScale:(BOOL)isEqualScale
                 onCliped:(HYBClipedCallback)callback;
/**
* 生成带四个圆角的图片,默认使用白色背景、isEqualScale=YES
*/
- (UIImage *)hyb_setImage:(id)image
                     size:(CGSize)targetSize
             cornerRadius:(CGFloat)cornerRaidus
                 onCliped:(HYBClipedCallback)callback;
 
/**
* 生成带四个圆角的图片,默认使用白色背景、isEqualScale=YES。当调用此API时,若控件本身大小是确定的,才能起效!
*/
- (UIImage *)hyb_setImage:(id)image
             cornerRadius:(CGFloat)cornerRaidus
                 onCliped:(HYBClipedCallback)callback;
 

生成任意圆角图片来填充

如果出现特殊的场景,需要生成三个圆角之类的特殊情况,或者生成上左、下左圆角或者生成上右、下右这样的组合情况时,可以通过下面的API来生成:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
- (UIImage *)hyb_setImage:(id)image
                     size:(CGSize)targetSize
             cornerRadius:(CGFloat)cornerRaidus
               rectCorner:(UIRectCorner)rectCorner
          backgroundColor:(UIColor *)backgroundColor
             isEqualScale:(BOOL)isEqualScale
                 onCliped:(HYBClipedCallback)callback;
/**
* 生成任意圆角的图片来填充控件。默认背景色为白色、isEqualScale=YES
*/
- (UIImage *)hyb_setImage:(id)image
                     size:(CGSize)targetSize
             cornerRadius:(CGFloat)cornerRaidus
               rectCorner:(UIRectCorner)rectCorner
                 onCliped:(HYBClipedCallback)callback;
/**
* 生成任意圆角的图片来填充控件。默认背景色为白色。如果控件本身大小确定,
* 可以直接使用此API来生成与控件大小相同的图片来填充。
*/
- (UIImage *)hyb_setImage:(id)image
             cornerRadius:(CGFloat)cornerRaidus
               rectCorner:(UIRectCorner)rectCorner
             isEqualScale:(BOOL)isEqualScale
                 onCliped:(HYBClipedCallback)callback;
/**
* 生成任意圆角的图片来填充控件。默认背景色为白色、isEqualScale=YES。如果控件本身大小确定,
* 可以直接使用此API来生成与控件大小相同的图片来填充。
*/
- (UIImage *)hyb_setImage:(id)image
             cornerRadius:(CGFloat)cornerRaidus
               rectCorner:(UIRectCorner)rectCorner
                 onCliped:(HYBClipedCallback)callback;
 

网络下载图片处理

下面是一段通过SDWebImage来实现的异步下载图片然后剪裁后再显示的代码:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
if (model.clipedImage) {
  self.imageView.image = model.clipedImage;
} else {
  __weak __typeof(self) weakSelf = self;
  UIImage *image = [UIImage imageNamed:@"img5.jpg"];
  [self.imageView sd_setImageWithURL:[NSURL URLWithString:model.url] placeholderImage:image options:SDWebImageRetryFailed completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
      
      // 将剪裁后的图片记录下来,下次直接使用
      model.clipedImage = [image hyb_clipToSize:weakSelf.imageView.bounds.size
                                   cornerRadius:12
                                backgroundColor:[UIColor blackColor]
                                   isEqualScale:NO];
      
      dispatch_async(dispatch_get_main_queue(), ^{
        weakSelf.imageView.image = model.clipedImage;
      });
    });
  }];
}
 

为了防止SDWebImage每次读取本地的,做了个判断,将裁剪后的图片放到模型中,下次直接使用即可!

根据颜色生成图片使用

 
1
2
3
4
5
6
 
UIImageView *colorImageView = [[UIImageView alloc] init];
colorImageView.frame = CGRectMake(200, 200, 80, 100);
[self.view addSubview:colorImageView];
colorImageView.image = [UIImage hyb_imageWithColor:[UIColor greenColor] toSize:CGSizeMake(80, 100) cornerRadius:20];
 

按钮使用

 
1
2
3
4
5
6
7
8
 
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(100, 200, 80, 80);
button.backgroundColor = [UIColor whiteColor];
[self.view addSubview:button];
[button hyb_setImage:@"img1.jpeg" forState:UIControlStateNormal cornerRadius:40 isEqualScale:YES];
[button hyb_setImage:@"bimg5.jpg" forState:UIControlStateHighlighted cornerRadius:40 isEqualScale:NO];
 

UIImageView使用

生成圆形图片:

 
1
2
3
4
5
 
[imgView hyb_setCircleImage:@"img1.jpeg" isEqualScale:YES onCliped:^(UIImage *clipedImage) {
    
}];
 

任意圆角

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(10, 100, 80, 80)];
view1.backgroundColor = [UIColor greenColor];
 
// 只加左上角
[view1 hyb_addCorner:UIRectCornerTopLeft cornerRadius:10];
 
[self.view addSubview:view1];
  
UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 80, 80)];
view2.backgroundColor = [UIColor greenColor];
 
// 只添加右
[view2 hyb_addCorner:UIRectCornerTopRight cornerRadius:10];
[self.view addSubview:view2];
 
UIView *view3 = [[UIView alloc] initWithFrame:CGRectMake(200, 100, 80, 80)];
view3.backgroundColor = [UIColor greenColor];
 
// 只添加下左角和下右角
[view3 hyb_addCorner:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadius:10];
[self.view addSubview:view3];
 

如何安装

支持Pod安装,可直接将下面的代码放到Podfile中:

 
1
2
3
 
pod 'HYBImageCliped', '~> 2.0.0'
 

或者到GITHUB直接下载【HYBImageCliped】将其中的Sources目录放入到工程!

iOS 开发--开源图片处理圆角的更多相关文章

  1. iOS开发基础-图片切换(4)之懒加载

    延续:iOS开发基础-图片切换(3),对(3)里面的代码用懒加载进行改善. 一.懒加载基本内容 懒加载(延迟加载):即在需要的时候才加载,修改属性的 getter 方法. 注意:懒加载时一定要先判断该 ...

  2. iOS开发基础-图片切换(3)之属性列表

    延续:iOS开发基础-图片切换(2),对(2)里面的代码用属性列表plist进行改善. 新建 Property List 命名为 Data 获得一个后缀为 .plist 的文件. 按如图修改刚创建的文 ...

  3. iOS开发基础-图片切换(2)之懒加载

    延续:iOS开发基础-图片切换(1),对(1)里面的代码进行改善. 在 ViewController 类中添加新的数组属性:  @property (nonatomic, strong) NSArra ...

  4. iOS开发小技巧 -- tableView-section圆角边框解决方案

    [iOS开发]tableView-section圆角边框解决方案 tableView圆角边框解决方案 iOS 7之前,图下圆角边框很容易设置 iOS 7之后,tableviewcell的风格不再是圆角 ...

  5. iOS开发--开源库

    图像: 1.图片浏览控件MWPhotoBrowser        实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩 ...

  6. iOS开发中图片方向的获取与更改

    iOS开发中 再用到照片的时候  或多或少遇到过这样的问题  就是我想用的照片有横着拍的有竖着排的  所以导致我选取图片后的效果也横七竖八的   显示效果不好 比如: 图中红圈选中的图片选取的是横着拍 ...

  7. iOS开发基础-图片切换(1)

    一.程序功能分析 1)点击左右箭头切换图片.序号.描述: 2)如果是首张图片,左边箭头失效: 3)如果是最后一张图片,右边箭头失效. 二.程序实现 定义确定图片位置.大小的常量: //ViewCont ...

  8. 李洪强iOS开发之图片拉伸技巧

    纵观移动市场,一款移动app,要想长期在移动市场立足,最起码要包含以下几个要素:实用的功能.极强的用户体验.华丽简洁的外观.华丽外观的背后,少不了美工的辛苦设计,但如果开发人员不懂得怎么合理展示这些设 ...

  9. 【ios开发】图片拉伸

    最近在做一个项目 其中要自己定制一个View 如图: 但是美工给了我的图片尺寸却是不一样的. 分别是599*80  26*61 于是就成了这样的效果. 很明显的发现取消四周不对劲. 于是我就去找美工姐 ...

随机推荐

  1. Redis源码研究--双向链表

    之前看的内容,占个位子,以后补上. ----------8月4日--------------- 双向链表这部分看的比较爽,代码写的中规中矩,心里窃喜,跟之前学的<数据结构>这本书中差不多. ...

  2. TClientDataSet中关于TField、TFieldDef动态创立字段的应用

    //使用 TFieldDef 建表: begin with ClientDataSet1.FieldDefs do begin Add('Name' , ftString, 12, True); { ...

  3. Lua 常用的shell命令

    lua作为一种小巧的脚本语言,其函数等动作可以使用shell命令进行运行和调试,以下是几个常用的shell命令.基本格式是  lua [选项参数] [脚本参数] (1)%lua 程序名.lua     ...

  4. WPF-控件-ListView

    <Window x:Class="DataTemplate2.MainWindow" xmlns="http://schemas.microsoft.com/win ...

  5. Virtualbox中安装Openwrt

    Virtualbox:https://www.virtualbox.org/wiki/DownloadsOpenwrt:http://downloads.openwrt.org/backfire/10 ...

  6. ORA-15221: ASM operation requires compatible.asm of 11.2.0.0.0 or higher

    昨天在做存储迁移的时候,对ASM磁盘组的东西进行操作时,出现了如标题的错误.经查资料,发现原因如下:     如磁盘组是使用asmca图形化工具创建,则compatible.asm默认设置就已经为11 ...

  7. 完整DataTable与IList互换(转)

    public class CollectionHelper { private CollectionHelper() { } public static DataTable ConvertTo< ...

  8. WebAPi性能

    提高WebAPi性能   前言 WebAPi作为接口请求的一种服务,当我们请求该服务时我们目标是需要快速获取该服务的数据响应,这种情况在大型项目中尤为常见,此时迫切需要提高WebAPi的响应机制,当然 ...

  9. python学习小结7:变量类型

    变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据类型,这些变量可以存储整 ...

  10. 小杜同学关于Query的一点知识

    小杜同学关于jQuery的一点知识 1.关于jQuery jQuery就是一个JavaScript的函数库.既然是JS的的函数库,它自然是做JS做的东西了.毕竟jQuery只是用JavaScript编 ...