123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- //
- // UIImage+Extension.swift
- // O2Platform
- //
- // Created by FancyLou on 2018/11/21.
- // Copyright © 2018 zoneland. All rights reserved.
- //
- import UIKit
- extension UIImage {
-
- /// EZSE: scales image
- public class func scaleTo(image: UIImage, w: CGFloat, h: CGFloat) -> UIImage {
- let newSize = CGSize(width: w, height: h)
- UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
- image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
- let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
- UIGraphicsEndImageContext()
- return newImage
- }
- func o2_aspectFitRectForSize(_ size: CGSize) -> CGRect {
- let targetAspect: CGFloat = size.width / size.height
- let sourceAspect: CGFloat = self.size.width / self.size.height
- var rect: CGRect = CGRect.zero
-
- if targetAspect > sourceAspect {
- rect.size.height = size.height
- rect.size.width = ceil(rect.size.height * sourceAspect)
- rect.origin.x = ceil((size.width - rect.size.width) * 0.5)
- } else {
- rect.size.width = size.width
- rect.size.height = ceil(rect.size.width / sourceAspect)
- rect.origin.y = ceil((size.height - rect.size.height) * 0.5)
- }
-
- return rect
- }
- //base64 转UIImage
- public static func base64ToImage(_ source:String,defaultImage:UIImage=UIImage(named: "personDefaultIcon")!) -> UIImage {
- if source != ""{
- let theImage = UIImage(data: Data(base64Encoded:source,options:NSData.Base64DecodingOptions.ignoreUnknownCharacters)!)
- return theImage!
- }else{
- return defaultImage
- }
- }
-
-
- func fixOrientation() -> UIImage {
- var image = self
- if self.imageOrientation == .up {
- return image
- }
- var transform = CGAffineTransform.identity
- switch self.imageOrientation {
- case .down, .downMirrored:
- transform = transform.translatedBy(x: image.size.width, y: image.size.height)
- transform = transform.rotated(by: .pi / 2)
- case .left, .leftMirrored:
- transform = transform.translatedBy(x: image.size.width, y: 0)
- transform = transform.rotated(by: .pi / 2)
- case .right, .rightMirrored :
- transform = transform.translatedBy(x: 0, y: image.size.height)
- transform = transform.rotated(by: -.pi / 2)
- default:
- break
- }
-
- switch self.imageOrientation {
- case .upMirrored, .downMirrored:
- transform = transform.translatedBy(x: image.size.width,y: 0)
- transform = transform.scaledBy(x: -1, y: 1)
- case .rightMirrored, .leftMirrored:
- transform = transform.translatedBy(x: image.size.height,y: 0)
- transform = transform.scaledBy(x: -1, y: 1)
- default:
- break
- }
-
- let ctx = CGContext(data: nil , width: Int(image.size.width), height: Int(image.size.height), bitsPerComponent: image.cgImage!.bitsPerComponent, bytesPerRow: 0, space: image.cgImage!.colorSpace!, bitmapInfo: image.cgImage!.bitmapInfo.rawValue)
-
- ctx!.concatenate(transform)
-
- switch image.imageOrientation {
- case .left, .leftMirrored, .right, .rightMirrored:
- ctx?.draw(image.cgImage!, in: CGRect(x: 0, y: 0, width: image.size.height, height: image.size.width))
- default:
- ctx?.draw(image.cgImage!, in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))
- }
-
- let cgImage = ctx!.makeImage()
- image = UIImage(cgImage: cgImage!)
- return image
- }
- static func createImage(color: UIColor, size: CGSize) -> UIImage? {
- var rect = CGRect(origin: CGPoint.zero, size: size)
- UIGraphicsBeginImageContext(size)
- defer {
- UIGraphicsEndImageContext()
- }
- let context = UIGraphicsGetCurrentContext()
- context?.setFillColor(color.cgColor)
- context?.fill(rect)
- let image = UIGraphicsGetImageFromCurrentImageContext()
- return image
- }
-
-
- func resizeImage(_ newSize: CGSize) -> UIImage {
- UIGraphicsBeginImageContextWithOptions(newSize, false, UIScreen.main.scale)
- self.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
- let newImage = UIGraphicsGetImageFromCurrentImageContext()
- UIGraphicsEndImageContext()
- return newImage!
- }
-
- // iOS 9 以后,ImageView.image 设置圆角并不会触发离屏渲染了
- // 可以异步绘制,再主线刷新
- func imageCornerRadius(_ radius: CGFloat) -> UIImage? {
- let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
- UIGraphicsBeginImageContextWithOptions(self.size, false, UIScreen.main.scale);
- guard let ctx = UIGraphicsGetCurrentContext() else {
- return nil
- }
- ctx.addPath(UIBezierPath(roundedRect: rect, cornerRadius: radius).cgPath)
- ctx.clip()
- draw(in: rect)
- let image = UIGraphicsGetImageFromCurrentImageContext()
- UIGraphicsEndImageContext()
- return image
- }
-
- func scaledImageFrom3x() -> UIImage {
- let theRate: CGFloat = 1.0 / 3.0
- let oldSize = self.size
- let scaleWidth = CGFloat(oldSize.width) * theRate
- let scaleHeight = CGFloat(oldSize.height) * theRate
- var scaleRect = CGRect.zero
- scaleRect.size = CGSize(width: scaleWidth, height: scaleHeight)
- UIGraphicsBeginImageContextWithOptions(scaleRect.size, false, UIScreen.main.scale)
- draw(in: scaleRect)
- let newImage = UIGraphicsGetImageFromCurrentImageContext()!
- UIGraphicsEndImageContext()
- return newImage
- }
- }
-
|