123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- //
- // Extension+UIImage.swift
- // RainbowPlanet
- //
- // Created by 南鑫林 on 2018/9/27.
- // Copyright © 2018 南鑫林. All rights reserved.
- //
- import UIKit
- extension UIImage {
-
- /// 添加着色方法
- ///
- /// - Parameters:
- /// - color: 颜色
- /// - blendMode: 实现图片颜色的修改
- /// - Returns: 图片
- func tint(color: UIColor, blendMode: CGBlendMode) -> UIImage {
- let drawRect = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height)
- UIGraphicsBeginImageContextWithOptions(size, false, scale)
- //let context = UIGraphicsGetCurrentContext()
- //CGContextClipToMask(context, drawRect, CGImage)
- color.setFill()
- UIRectFill(drawRect)
- draw(in: drawRect, blendMode: blendMode, alpha: 1.0)
- let tintedImage = UIGraphicsGetImageFromCurrentImageContext()
- UIGraphicsEndImageContext()
- return tintedImage!
- }
-
- /// 水印位置枚举
- ///
- /// - TopLeft: 左上
- /// - TopRight: 右上
- /// - BottomLeft: 左下
- /// - BottomRight: 右下
- enum WaterMarkCorner{
- case TopLeft
- case TopRight
- case BottomLeft
- case BottomRight
- }
-
- /// 添加水印方法
- ///
- /// - Parameters:
- /// - waterMarkText: 水印字体
- /// - corner: 内容
- /// - margin: 间距
- /// - waterMarkTextColor: 水印字体颜色
- /// - waterMarkTextFont: 字体大小
- /// - backgroundColor: 背景色
- /// - Returns: 图片
- func waterMarkedImage(waterMarkText:String,
- corner:WaterMarkCorner = .BottomRight,
- margin:CGPoint = CGPoint(x: 20, y: 20),
- waterMarkTextColor:UIColor = UIColor.white,
- waterMarkTextFont:UIFont = UIFont.systemFont(ofSize: 20),
- backgroundColor:UIColor = UIColor.clear) -> UIImage {
-
- let textAttributes = [NSAttributedString.Key.foregroundColor:waterMarkTextColor,
- NSAttributedString.Key.font:waterMarkTextFont,
- NSAttributedString.Key.backgroundColor:backgroundColor]
- let textSize = NSString(string: waterMarkText).size(withAttributes: textAttributes)
- var textFrame = CGRect(x: 0, y: 0, width: textSize.width, height: textSize.height)
-
- let imageSize = self.size
- switch corner{
- case .TopLeft:
- textFrame.origin = margin
- case .TopRight:
- textFrame.origin = CGPoint(x: imageSize.width - textSize.width - margin.x, y: margin.y)
- case .BottomLeft:
- textFrame.origin = CGPoint(x: margin.x, y: imageSize.height - textSize.height - margin.y)
- case .BottomRight:
- textFrame.origin = CGPoint(x: imageSize.width - textSize.width - margin.x,
- y: imageSize.height - textSize.height - margin.y)
- }
-
- // 开始给图片添加文字水印
- UIGraphicsBeginImageContext(imageSize)
- self.draw(in: CGRect(x: 0, y: 0, width: imageSize.width, height: imageSize.height))
- NSString(string: waterMarkText).draw(in: textFrame, withAttributes: textAttributes)
-
- let waterMarkedImage = UIGraphicsGetImageFromCurrentImageContext()
- UIGraphicsEndImageContext()
-
- return waterMarkedImage!
- }
-
- /// 添加图片水印方法
- ///
- /// - Parameters:
- /// - waterMarkImage: 图片
- /// - corner: 位置
- /// - margin: 间距
- /// - alpha: 透明度
- /// - Returns: 图片
- func waterMarkedImage(waterMarkImage:UIImage,
- corner:WaterMarkCorner = .BottomRight,
- margin:CGPoint = CGPoint(x: 20, y: 20),
- alpha:CGFloat = 1) -> UIImage{
-
- var markFrame = CGRect(x: 0, y: 0, width: waterMarkImage.size.width, height: waterMarkImage.size.height)
- let imageSize = self.size
-
- switch corner{
- case .TopLeft:
- markFrame.origin = margin
- case .TopRight:
- markFrame.origin = CGPoint(x: imageSize.width - waterMarkImage.size.width - margin.x,
- y: margin.y)
- case .BottomLeft:
- markFrame.origin = CGPoint(x: margin.x,
- y: imageSize.height - waterMarkImage.size.height - margin.y)
- case .BottomRight:
- markFrame.origin = CGPoint(x: imageSize.width - waterMarkImage.size.width - margin.x,
- y: imageSize.height - waterMarkImage.size.height - margin.y)
- }
-
- // 开始给图片添加图片
- UIGraphicsBeginImageContext(imageSize)
- self.draw(in: CGRect(x: 0, y: 0, width: imageSize.width, height: imageSize.height))
- waterMarkImage.draw(in: markFrame, blendMode: .normal, alpha: alpha)
- let waterMarkedImage = UIGraphicsGetImageFromCurrentImageContext()
- UIGraphicsEndImageContext()
-
- return waterMarkedImage!
- }
-
- /// 棕褐色复古滤镜(老照片效果)
- ///
- /// - Returns: 图片
- 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, from: outputImage.extent)
- return UIImage(cgImage: outImage!)
- }
- return nil
- }
-
- //黑白效果滤镜
- 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, from: outputImage.extent)
- return UIImage(cgImage: outImage!)
- }
- return nil
- }
- /// 将颜色转换为图片
- ///
- /// - Parameter color: UIColor
- /// - Returns: UIImage
- class func imageWithColor(color:UIColor)->UIImage{
- let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
- UIGraphicsBeginImageContext(rect.size)
- let context = UIGraphicsGetCurrentContext()
- context!.setFillColor(color.cgColor)
- context!.fill(rect)
- let image = UIGraphicsGetImageFromCurrentImageContext()
- UIGraphicsEndImageContext()
- return image!
- }
-
- class func image(with color: UIColor?, size: CGSize, isRoundedCorner isRounded: Bool) -> UIImage? {
- let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
- UIGraphicsBeginImageContextWithOptions(size, _: false, _: UIScreen.main.scale)
- let context = UIGraphicsGetCurrentContext()
- context?.setFillColor(color!.cgColor)
- context?.fill(rect)
-
- var image = UIGraphicsGetImageFromCurrentImageContext()
- UIGraphicsEndImageContext()
-
- if isRounded {
- let radius: CGFloat = size.width/2
-
- let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
- UIGraphicsBeginImageContextWithOptions(size, _: false, _: UIScreen.main.scale)
- let context = UIGraphicsGetCurrentContext()
- let path = UIBezierPath(roundedRect: rect, byRoundingCorners: .allCorners, cornerRadii: CGSize(width: radius, height: radius))
- context?.addPath(path.cgPath)
- context?.clip()
- image?.draw(in: rect)
- context?.drawPath(using: .fillStroke)
-
- image = UIGraphicsGetImageFromCurrentImageContext()
- UIGraphicsEndImageContext()
- }
-
- return image
- }
-
- class func getImageSize(_ url: String?) -> CGSize {
- guard let urlStr = url else {
- return CGSize.zero
- }
-
- let tempUrl = URL(string: urlStr)
- let imageSourceRef = CGImageSourceCreateWithURL(tempUrl! as CFURL, nil)
- var width: CGFloat = 0
- var height: CGFloat = 0
- if let imageSRef = imageSourceRef {
- let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSRef, 0, nil)
- if let imageP = imageProperties {
- let imageDict = imageP as Dictionary
- width = imageDict[kCGImagePropertyPixelWidth] as! CGFloat
- height = imageDict[kCGImagePropertyPixelHeight] as! CGFloat
- }
- }
- return CGSize(width: width, height: height)
- }
-
- class func imageUrl(_ url: String?) -> UIImage {
- let url = URL(string: url ?? "")!
- let data = try? Data(contentsOf: url)
- let image : UIImage?
- if data != nil {
- image = UIImage(data: data!, scale: 0.5)
- }else {
- image = kImage(name: "LaunchScreenLogo")
- }
- return image!
- }
- }
- extension UIImage {
- class func rotate(aImage:UIImage) -> UIImage {
- // 向上 直接返回
- if aImage.imageOrientation == .up {
- return aImage
- }
-
- // 向下M_PI 向左M_PI_2 向右-M_PI_2
- var transform: CGAffineTransform = CGAffineTransform.identity
- switch aImage.imageOrientation {
- case .down, .downMirrored:
- transform = transform.translatedBy(x: aImage.size.width, y: aImage.size.height)
- transform = transform.rotated(by: CGFloat(Double.pi))
- case .left, .leftMirrored:
- transform = transform.translatedBy(x: aImage.size.width, y: 0)
- transform = transform.rotated(by: CGFloat(Double.pi / 2))
- case .right, .rightMirrored:
- transform = transform.translatedBy(x: 0, y: aImage.size.height)
- transform = transform.rotated(by: CGFloat(-Double.pi / 2))
- default:
- break
- }
-
- switch aImage.imageOrientation {
- case .upMirrored, .downMirrored:
- transform = transform.translatedBy(x: aImage.size.width, y: 0)
- transform = transform.scaledBy(x: -1, y: 1)
- case .leftMirrored, .rightMirrored:
- transform = transform.translatedBy(x: aImage.size.height, y: 0)
- transform = transform.scaledBy(x: -1, y: 1)
- default:
- break
- }
-
- //渲染
-
- let ctx: CGContext = CGContext(data: nil, width: Int(aImage.size.width), height: Int(aImage.size.height), bitsPerComponent: aImage.cgImage!.bitsPerComponent, bytesPerRow: 0, space: aImage.cgImage!.colorSpace!, bitmapInfo: aImage.cgImage!.bitmapInfo.rawValue)!
- ctx.concatenate(transform)
- switch aImage.imageOrientation {
- case .left, .leftMirrored, .right, .rightMirrored:
-
- ctx.draw(aImage.cgImage!, in: CGRect(x: 0, y: 0, width: aImage.size.height, height: aImage.size.width))
- default:
- ctx.draw(aImage.cgImage!, in: CGRect(x: 0, y: 0, width: aImage.size.width, height: aImage.size.height))
- }
-
- // 新的图片
- let cgimg: CGImage = ctx.makeImage()!
- let img: UIImage = UIImage(cgImage: cgimg)
- return img
- }
- }
|