import UIKit

//MARK: - 获取 view的快照视图(返回 UIImageView)
public func snapshotFromView(inputView: UIView) -> UIView{
    
    UIGraphicsBeginImageContextWithOptions(inputView.bounds.size, false, 0)
    inputView.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
    let snapshotView = UIImageView(image: image)
    snapshotView.layer.masksToBounds = false
    snapshotView.layer.cornerRadius = 0
    snapshotView.layer.shadowOffset = CGSizeMake(-5, 0)
    snapshotView.layer.shadowRadius = 5
    snapshotView.layer.shadowOpacity = 0.4
    
    return snapshotView
}

//MARK: - 生成指定尺寸的纯色图片
public func imageWithColor(color: UIColor!, size: CGSize) -> UIImage{
    var size = size
    if CGSizeEqualToSize(size, CGSizeZero){
        size = CGSizeMake(1, 1)
    }
    let rect = CGRectMake(0, 0, size.width, size.height)
    UIGraphicsBeginImageContext(rect.size)
    let context = UIGraphicsGetCurrentContext()
    CGContextSetFillColorWithColor(context, color.CGColor)
    CGContextFillRect(context, rect)
    
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
}

//MARK: - 修改图片尺寸
public func imageScaleToSize(image: UIImage, size: CGSize) -> UIImage{
    // 创建一个bitmap的context
    // 并把它设置成为当前正在使用的context
    // Determine whether the screen is retina
    if UIScreen.mainScreen().scale == 2.0{
        UIGraphicsBeginImageContextWithOptions(size, false, 2.0)
    }else{
        UIGraphicsBeginImageContext(size)
    }
    
    // 绘制改变大小的图片
    image.drawInRect(CGRectMake(0, 0, size.width, size.height))
    
    // 从当前context中创建一个改变大小后的图片
    let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
    
    // 使当前的context出堆栈
    UIGraphicsEndImageContext()
    
    // 返回新的改变大小后的图片
    return scaledImage
}

public func ciimageScaleToSize(ciimage: CIImage, size: CGSize) -> UIImage{
    let cgImage = CIContext(options: nil).createCGImage(ciimage, fromRect: ciimage.extent)
    if UIScreen.mainScreen().scale == 2.0{
        UIGraphicsBeginImageContextWithOptions(size, false, 2.0)
    }else{
        UIGraphicsBeginImageContext(size)
    }
    
    let context = UIGraphicsGetCurrentContext()
    CGContextSetInterpolationQuality(context, CGInterpolationQuality.None)
    CGContextScaleCTM(context, 1.0, -1.0)
    CGContextDrawImage(context, CGContextGetClipBoundingBox(context), cgImage)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
    return image
}

//MARK: - 调整图片方向向上
public func imageOrientationToUp(image: UIImage) -> UIImage{
    let imageRef = image.CGImage
    let imageSize = CGSizeMake(CGFloat(CGImageGetWidth(imageRef)), CGFloat(CGImageGetHeight(imageRef)))
    var newSzie = imageSize
    
    var transform = CGAffineTransformIdentity
    let orientation = image.imageOrientation
    switch orientation{
    case .Up:
        transform = CGAffineTransformIdentity
        
    case .UpMirrored:
        transform = CGAffineTransformMakeTranslation(imageSize.width, 0)
        transform = CGAffineTransformScale(transform, -1, 1)
        
    case .Down:
        transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height)
        transform = CGAffineTransformRotate(transform, CGFloat(M_PI))
        
    case .DownMirrored:
        transform = CGAffineTransformMakeTranslation(0.0, imageSize.height)
        transform = CGAffineTransformScale(transform, 1.0, -1.0)
        
    case .Left:
        (newSzie.width, newSzie.height) = (newSzie.height, newSzie.width)
        transform = CGAffineTransformMakeTranslation(0.0, imageSize.width)
        transform = CGAffineTransformRotate(transform, CGFloat(3.0 * M_PI / 2.0))
        
    case .LeftMirrored:
        (newSzie.width, newSzie.height) = (newSzie.height, newSzie.width)
        transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width)
        transform = CGAffineTransformScale(transform, -1.0, 1.0)
        transform = CGAffineTransformRotate(transform, CGFloat(3.0 * M_PI / 2.0))
        
    case .Right:
        (newSzie.width, newSzie.height) = (newSzie.height, newSzie.width)
        transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0)
        transform = CGAffineTransformRotate(transform, CGFloat(M_PI / 2.0))
        
    case .RightMirrored:
        (newSzie.width, newSzie.height) = (newSzie.height, newSzie.width)
        transform = CGAffineTransformMakeScale(-1.0, 1.0)
        transform = CGAffineTransformRotate(transform, CGFloat(M_PI / 2.0))
        
    }
    
    UIGraphicsBeginImageContext(newSzie)
    let context = UIGraphicsGetCurrentContext()
    
    if orientation == UIImageOrientation.Right || orientation == UIImageOrientation.Left{
        CGContextScaleCTM(context, -1, 1)
        CGContextTranslateCTM(context, -imageSize.height, 0)
    }else{
        CGContextScaleCTM(context, 1, -1)
        CGContextTranslateCTM(context, 0, -imageSize.height)
    }
    CGContextConcatCTM(context, transform)
    CGContextDrawImage(context, CGRectMake(0, 0, imageSize.width, imageSize.height), imageRef)
    let imageCopy = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
    return imageCopy
}

//MARK: - 压缩图片大小
public func imageCompress(originalImage: UIImage) -> UIImage{
    guard let imageData = UIImageJPEGRepresentation(originalImage, 0.5) else{
        return originalImage
    }
    
    let compressImage = UIImage(data: imageData)!
    return compressImage
}