UIImage+Category.swift 8.46 KB
//
//  UIImage+Category.swift
//  UniKar
//
//  Created by pxh on 2016/12/6.
//  Copyright © 2016年 pxh. All rights reserved.
//

import UIKit
import MBProgressHUD
import Photos
import Charts

extension UIImage {
    
    //    func accessCameraAuthority() -> Bool
    //    {
    //        let authStatus = AVCaptureDevice.authorizationStatus(for: .video)
    //        if authStatus == .restricted || authStatus == .denied {
    //            MBProgressHUD.show("请在iPhone的 设置-隐私-相机 中允许访问相机")
    //        } else if PHPhotoLibrary.authorizationStatus().rawValue == 2 {
    //            MBProgressHUD.show("请在iPhone的 设置-隐私-相册 中允许访问相册")
    //        } else {
    //
    //        }
    //    }
    func saveImageToPath(_ name: String) {
        if let imageData = self.pngData() {
            let imagePath = self.imagePath() + "\(name).png"
            try? imageData.write(to: URL(fileURLWithPath: imagePath), options: .atomic)
        }
    }
    
    class func getImageFromPath(_ name: String)-> UIImage? {
        if let image = UIImage(contentsOfFile: NSHomeDirectory() + "/Documents/images/\(name).png") {
            return image
        } else {
            return nil
        }
    }
    
    private func imagePath() -> String {
        let newPath = NSHomeDirectory() + "/Documents/images/"
        if !FileManager.default.fileExists(atPath: newPath) {
            print(newPath)
            try! FileManager.default.createDirectory(atPath: newPath, withIntermediateDirectories: true, attributes: nil)
        }
        return newPath
    }
    
    
//    private func getDocumentsDirectory() -> URL {
//        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
//
//        return paths[0]
//    }
    
    
    
    func saveImageToPhotoLibrary() {
        
        let img = self
        
        // 判断权限
        switch PHPhotoLibrary.authorizationStatus() {
        case .authorized:
            saveImage(image: img)
        case .notDetermined:
            PHPhotoLibrary.requestAuthorization { [weak self](status) in
                if status == .authorized {
                    self?.saveImage(image: img)
                } else {
                    print("User denied")
                }
            }
            
        case .restricted, .denied:
            MBProgressHUD.showh("请开启允许访问相册权限")
            //            if let url = URL.init(string: UIApplication.openSettingsURLString) {
            //                if UIApplication.shared.canOpenURL(url) {
            //                    UIApplication.shared.openURL(url)
            //                }
            //            }
        default:
            break
            
        }
    }
    
    private func saveImage(image: UIImage) {
        PHPhotoLibrary.shared().performChanges({
            PHAssetChangeRequest.creationRequestForAsset(from: image)
        }, completionHandler: { (isSuccess, error) in
            DispatchQueue.main.async {
                if isSuccess {// 成功
                    MBProgressHUD.showh("已保存到系统相册")
                }
            }
        })
    }
    
    
    
    
    //压缩图片  10k
    func compressOriginalImage(_ maxSizeKbytes: CGFloat) -> UIImage? {
        
        
        var imageData = UIImage.jpegData(self)(compressionQuality: 1.0)
        var dataKBytes = CGFloat((imageData?.count)!)/1000.0
        var maxQuality: CGFloat = 0.9
        var lastData = dataKBytes
        while dataKBytes > maxSizeKbytes && maxQuality > 0.01 {
            print("压缩图片!")
            maxQuality -= 0.01
            imageData = UIImage.jpegData(self)(compressionQuality: maxQuality)//UIImageJPEGRepresentation(self, maxQuality)
            dataKBytes = CGFloat((imageData?.count)!)/1000.0
            if lastData == dataKBytes {
                break
            } else {
                lastData = dataKBytes
            }
        }
        return UIImage.init(data: imageData!)
    }
    
    class func getImageWithColor(_ color : UIColor , rect : CGRect)->UIImage{
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()
        context!.setFillColor(color.cgColor)
        let fillRect = CGRect.init(origin: CGPoint.zero, size: rect.size)
        context!.fill(fillRect)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image!
    }
    
    class func maskImageWithMaskrect(maskRect:CGRect,clearRect:CGRect) -> UIImage {
        UIGraphicsBeginImageContext(maskRect.size)
        let ctx = UIGraphicsGetCurrentContext()
        ctx?.setFillColor(UIColor.black.cgColor)
        ctx?.setFillColor(red: 0, green: 0, blue: 0, alpha: 0.6)
        ctx?.fill(maskRect)
        ctx?.clear(clearRect)
        
        let img = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return img!
    }
    
    
    
    
    //黑白效果滤镜
    func noir() -> UIImage?
    {
        let imageData = self.pngData()
        let inputImage = CoreImage.CIImage(data: imageData!)
        let context = CIContext(options:nil)
        let filter = CIFilter(name:"CIPhotoEffectNoir")
        filter!.setValue(inputImage, forKey: kCIInputImageKey)
        if let outputImage = filter!.outputImage {
            //            let outImage = context.createCGImage(outputImage, fromRect: outputImage.extent)
            let outImage = context.createCGImage(outputImage, from: outputImage.extent)
            //            return UIImage(CGImage: outImage!)
            return UIImage.init(cgImage: outImage!)
        }
        return nil
    }
    
    
    //棕褐色复古滤镜(老照片效果)
    func sepiaTone() -> UIImage?
    {
        let imageData = self.pngData()
        let inputImage = CoreImage.CIImage(data: imageData!)
        let context = CIContext(options:nil)
        let filter = CIFilter(name:"CISepiaTone")
        filter!.setValue(inputImage, forKey: kCIInputImageKey)
        filter!.setValue(0.8, forKey: "inputIntensity")
        if let outputImage = filter!.outputImage {
            //            let outImage = context.createCGImage(outputImage, fromRect: outputImage.extent)
            //            return UIImage(CGImage: outImage)
            let outImage = context.createCGImage(outputImage, from: outputImage.extent)
            return UIImage.init(cgImage: outImage!)
        }
        return nil
    }
    
    //将string转化为二维码
    class func createQRForString(qrString: String?, qrImageName: String?) -> UIImage?{
        if let sureQRString = qrString{
            let stringData = sureQRString.data(using: String.Encoding.utf8, allowLossyConversion: false)
            //创建一个二维码的滤镜
            let qrFilter = CIFilter(name: "CIQRCodeGenerator")
            qrFilter?.setValue(stringData, forKey: "inputMessage")
            qrFilter?.setValue("H", forKey: "inputCorrectionLevel")
            let qrCIImage = qrFilter?.outputImage
            
            // 创建一个颜色滤镜,黑白色
            let colorFilter = CIFilter(name: "CIFalseColor")!
            colorFilter.setDefaults()
            colorFilter.setValue(qrCIImage, forKey: "inputImage")
            colorFilter.setValue(CIColor(red: 0, green: 0, blue: 0), forKey: "inputColor0")
            colorFilter.setValue(CIColor(red: 1, green: 1, blue: 1), forKey: "inputColor1")
            // 返回二维码image
            let codeImage = UIImage(ciImage: (colorFilter.outputImage!.transformed(by: CGAffineTransform(scaleX: 5, y: 5))))
            
            // 中间一般放logo
            if let iconImage = UIImage(named: qrImageName!) {
                let rect = CGRect(x: 0, y: 0, width: codeImage.size.width, height: codeImage.size.height)
                
                UIGraphicsBeginImageContext(rect.size)
                codeImage.draw(in: rect)
                let avatarSize = CGSize(width: rect.size.width*0.25, height: rect.size.height*0.25)
                
                let x = (rect.width - avatarSize.width) * 0.5
                let y = (rect.height - avatarSize.height) * 0.5
                iconImage.draw(in: CGRect(x: x, y: y, width: avatarSize.width, height: avatarSize.height))
                
                let resultImage = UIGraphicsGetImageFromCurrentImageContext()
                
                UIGraphicsEndImageContext()
                return resultImage
            }
            return codeImage
        }
        return nil
    }
}