iOS -- 图片处理

作者: iOS_成才录 | 来源:发表于2015-11-12 19:21 被阅读3739次

    一、目录

    • 1> 图片拉伸处理
    • 2> 图片扩展名
    • 3> 大图减小高度,图片拉伸处理
    • 4> 点击大图,Modal出来,查看大图控制器
    • 5> 图片圆角设置
    • 6> APP中所有头像都设置为圆角,如何抽取?

    二、应用逻辑处理

    2.1 图片拉伸处理

    iOS5以前
    • UIImage方法 stretchableImageWithLeftCapWidth:
        // LeftCapWidth: 左边多少不能拉伸
        // 右边多少不能拉伸 = 控件的宽度 - 左边多少不能拉伸 - 1
        //  right  =  width - leftCapWidth - 1
        // 1 = width - leftCapWidth - right
    
        // topCapHeight: 顶部多少不能拉伸
        // 底部有多少不能拉伸 = 控件的高度 - 顶部多少不能拉伸 - 1
        //  bottom =  height - topCapWidth - 1
        // 1 = height - topCapWidth - bottom
        UIImage *newImage = [image stretchableImageWithLeftCapWidth:5 topCapHeight:5];
    
     [btn setBackgroundImage:newImage forState:UIControlStateNormal];  
       btn.frame = CGRectMake(100, 100, 200, 80);
       [self.view addSubview:btn];
    
    iOS5开始
    • UIImage方法 resizableImageWithCapInsets:
        // UIEdgeInsets是告诉系统哪些地方需要受保护, 也就是不可以拉伸
        // resizableImageWithCapInsets默认拉伸方式是平铺
        UIEdgeInsets insets = UIEdgeInsetsMake(image.size.height * 0.5, image.size.width * 0.5, image.size.height * 0.5, image.size.width * 0.5);
        UIImage *newImage =  [image resizableImageWithCapInsets:insets];
    [btn setBackgroundImage:newImage forState:UIControlStateNormal];
     btn.frame = CGRectMake(100, 100, 200, 80);
     [self.view addSubview:btn];
    
    iOS6开始
    • UIImage方法:resizableImageWithCapInsets: resizingMode:
        // resizingMode指定拉伸模式
        // 平铺
        // 拉伸
        UIEdgeInsets insets = UIEdgeInsetsMake(5, 5, 5, 5);
        UIImage *newImage =  [image resizableImageWithCapInsets:insets resizingMode:UIImageResizingModeStretch];
        [btn setBackgroundImage:newImage forState:UIControlStateNormal];
        btn.frame = CGRectMake(100, 100, 200, 80);
        [self.view addSubview:btn];
    

    2.2 图片扩展名

    • 需求:如果不是gif图片,则Cell中间部分布局xib左边的UIImageView控件“gif”隐藏

    • 判断图片是不是gif图片的几种方式:

      • 方案一:根据图片名称获取图片的扩展名
      • 方案二:看服务器是否返回了图片的类型
      • 方案三:如果图片已经下载完毕,我们可以拿到图片数据,取出图片数据的第一个字节,就可以判断其类型
      Snip20150916_50.png
      Snip20150916_51.png

    2.3 大图减小高度,图片拉伸处理

    需求:如果图片太大,则高度减小点,控制图片高度,保证图片不被拉伸
    • 图片拉伸处理:因为大图图片,我们将其高度调整处理减小高度后,图片拉伸处理
      • 注意:Aspet Fit : 等比例伸缩,直到填充ImageView
    Snip20150916_52.png
    • 处理大图:是大图,我们就需要设置内容模型
      if (是大图) {
            // 是大图,内容模型为顶部对齐
            self.imageView.contentMode = UIViewContentModeTop;
            self.imageView.clipsToBounds = YES; // 裁剪
        } else {
            // 不是大图,填充模型
            self.imageView.contentMode = UIViewContentModeScaleToFill; 
            self.imageView.clipsToBounds = NO; // 不裁剪
        }
    

    2.4 点击大图,Modal出来,查看大图控制器

    • 点击图片,弹出显示大图控制器SeePictureViewController,如何监听图片的点击,给imageView添加手势
    • 下载完毕才可以点击,可以判断imageView.image是否有值即可判断是否下载完
    • 显示大图控制器SeePictureViewController
      • 结构:xib布局(页面顶部 -> "返回"按钮; 底部 -> "保存"按钮;),手动添加一个UIScrollView 并添加一个UIImageView作为其类型显示图片
    • 分析:
      • 1.在我们Modal出查看大图控制器SeePictureViewController前,需要将图片名称传递给该控制器,这样才能控制图片数据显示
      • 2.控制器之间的顺传,我们直接在SeePictureViewController添加一个图片名称属性即可,然后在Modal出该控制器之前将图片名称数据赋值给该控制器就OK了。
      • 3.判断图片是不是大图:
        • 不是大图 -》就让其居中显示在屏幕即可
        • 是大图 -》让其从屏幕的左上角开始显示
      • 4.让控制器成为UIScrollView的代理,实现代理方法,让图片可以伸缩实现
      • 5.点击保存按钮,将图片保存到相册

    2.5 cell上面的图片圆角设置

    方案一:图层layer
    • 缺点:如果使用过于频繁,可能会导致拖拽起来的感觉比较卡现象
    @implementation JPCell
    - (void)awakeFromNib
    {
        // 如果使用过于频繁,可能会导致拖拽起来的感觉比较卡
         self.imageListView.layer.cornerRadius = self.imageListView.width * 0.5;
         self.imageListView.layer.masksToBounds = YES;
    }
    @end
    
    方案二:Quartz2D裁剪图片
    • 优点:不会出现设置layer图层属性,过度卡顿效果,推荐
    • 实现:下载好图片,通过Quartz2D裁剪图片 成圆角保存
    • 优化:UIImage分类抽取
      • 为了以后的扩展,而且它是对图片进行裁剪,所以我们给UIImage抽取一个分类,返回裁剪后的圆角图片
    #import <UIKit/UIKit.h>
    
    @interface UIImage (JPExtension)
    /**
     * 返回一张圆形图片
     */
    - (instancetype)circleImage;
    
    /**
     * 返回一张圆形图片
     */
    + (instancetype)circleImageNamed:(NSString *)name;
    @end
    
    #import "UIImage+JPExtension.h"
    
    @implementation UIImage (JPExtension)
    - (instancetype)circleImage
    {
        // 开启图形上下文
        UIGraphicsBeginImageContext(self.size);
        
        // 获得上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        
        // 矩形框
        CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
        
        // 添加一个圆
        CGContextAddEllipseInRect(ctx, rect);
        
        // 裁剪(裁剪成刚才添加的图形形状)
        CGContextClip(ctx);
        
        // 往圆上面画一张图片
        [self drawInRect:rect];
        
        // 获得上下文中的图片
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        
        // 关闭图形上下文
        UIGraphicsEndImageContext();
        return image;
    }
    
    + (instancetype)circleImageNamed:(NSString *)name
    {
        return [[self imageNamed:name] circleImage];
    }
    @end
    

    2.6 思考:APP中所有头像都设置为圆角,如何抽取?

    • 解决方案:给ImageView写了分类,封装图片裁剪处理细节在内部。
    • 好处:统一,方便以后改变成其他样式,不管是矩形还是...
    #import <UIKit/UIKit.h>
    
    @interface UIImageView (JPExtension)
    /**
     * 设置头像
     */
    - (void)setHeader:(NSString *)url;
    @end
    
    #import "UIImageView+JPExtension.h"
    #import <UIImageView+WebCache.h>
    
    @implementation UIImageView (JPExtension)
    - (void)setHeader:(NSString *)url
    {
        [self setCircleHeader:url];
    }
    
    - (void)setRectHeader:(NSString *)url
    {
        [self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:@"defaultUserIcon"]];
    }
    
    - (void)setCircleHeader:(NSString *)url
    {
        JPWeakSelf;
        UIImage *placeholder = [[UIImage imageNamed:@"defaultUserIcon"] circleImage]; // 使用了上面的一个分类,裁剪圆角图片返回
        [self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:placeholder completed:
         ^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
           // 如果图片下载失败,就不做任何处理,按照默认的做法:会显示占位图片
           if (image == nil) return;
           weakSelf.image = [image circleImage];
       }];
    }
    @end
    

    相关文章

      网友评论

      本文标题:iOS -- 图片处理

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