美文网首页征服SwiftiOS-swift
Swift UIImage扩展支持指定压缩大小

Swift UIImage扩展支持指定压缩大小

作者: 小黑Swift | 来源:发表于2016-03-07 20:43 被阅读3333次

    UIImage+Extension.swift

        //
        //  UIImage+Extension.swift
        //  逗牛
        //
        //  Created by mac on 16/3/7.
        //  Copyright © 2016年 mac. All rights reserved.
        //
    import UIKit
    
    extension UIImage {
        
        ///对指定图片进行拉伸
        func resizableImage(name: String) -> UIImage {
            
            var normal = UIImage(named: name)! 
            let imageWidth = normal.size.width * 0.5
            let imageHeight = normal.size.height * 0.5  
            normal = resizableImageWithCapInsets(UIEdgeInsetsMake(imageHeight, imageWidth, imageHeight, imageWidth))
            
            return normal
        }
        
        /**
         *  压缩上传图片到指定字节
         *
         *  image     压缩的图片
         *  maxLength 压缩后最大字节大小
         *
         *  return 压缩后图片的二进制
         */
        func compressImage(image: UIImage, maxLength: Int) -> NSData? {
            
            let newSize = self.scaleImage(image, imageLength: 300)
            let newImage = self.resizeImage(image, newSize: newSize)
            
            var compress:CGFloat = 0.9
            var data = UIImageJPEGRepresentation(newImage, compress)
            
            while data?.length > maxLength && compress > 0.01 {
                compress -= 0.02  
                data = UIImageJPEGRepresentation(newImage, compress)
            }
            
            return data
        }
        
        /**
         *  通过指定图片最长边,获得等比例的图片size
         *
         *  image       原始图片
         *  imageLength 图片允许的最长宽度(高度)
         *
         *  return 获得等比例的size
         */
        func  scaleImage(image: UIImage, imageLength: CGFloat) -> CGSize {
            
            var newWidth:CGFloat = 0.0
            var newHeight:CGFloat = 0.0
            let width = image.size.width
            let height = image.size.height
        
            if (width > imageLength || height > imageLength){
                
                if (width > height) {
                    
                    newWidth = imageLength;
                    newHeight = newWidth * height / width;
                    
                }else if(height > width){
                    
                    newHeight = imageLength;
                    newWidth = newHeight * width / height;
                    
                }else{
                    
                    newWidth = imageLength;
                    newHeight = imageLength;
                }
                
            }
            return CGSize(width: newWidth, height: newHeight)
        }
        
        /**
         *  获得指定size的图片
         *
         *  image   原始图片
         *  newSize 指定的size
         *
         *  return 调整后的图片
         */
        func resizeImage(image: UIImage, newSize: CGSize) -> UIImage {
            UIGraphicsBeginImageContext(newSize)
            image.drawInRect(CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
            
            let newImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            
            return newImage
        }
    
    }

    相关文章

      网友评论

      • 等你照顾我:我有一个疑问 既然是extension 为啥还要传递图片参数
        小黑Swift:@等你照顾我 是不用的,直接self即可:smile:
      • fe86d48aad87:感谢分享!另scaleImage方法有个小BUG,如果长宽都没超过设置的最大长度会返回一个(0,0)的Size,导致resizeImage生成空的上下文,从而获取指定size图片失败,compressImage压缩图片会崩溃
        小黑Swift:@heyuze 好的,感谢指出BUG,有空我再测试下:smile:

      本文标题:Swift UIImage扩展支持指定压缩大小

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