93 lines
3.2 KiB
Swift
93 lines
3.2 KiB
Swift
/*
|
|
Copyright 2019-2024 New Vector Ltd.
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-only
|
|
Please see LICENSE in the repository root for full details.
|
|
*/
|
|
|
|
import Foundation
|
|
|
|
extension UIImage {
|
|
|
|
class func vc_image(from color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) -> UIImage? {
|
|
let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
|
|
UIGraphicsBeginImageContext(rect.size)
|
|
let context = UIGraphicsGetCurrentContext()
|
|
|
|
context?.setFillColor(color.cgColor)
|
|
context?.fill(rect)
|
|
|
|
var image = UIGraphicsGetImageFromCurrentImageContext()
|
|
UIGraphicsEndImageContext()
|
|
|
|
UIGraphicsBeginImageContext(size)
|
|
image?.draw(in: rect)
|
|
image = UIGraphicsGetImageFromCurrentImageContext()
|
|
UIGraphicsEndImageContext()
|
|
|
|
return image
|
|
}
|
|
|
|
@objc func vc_tintedImage(usingColor tintColor: UIColor) -> UIImage? {
|
|
UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
|
|
let drawRect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)
|
|
|
|
self.draw(in: drawRect)
|
|
tintColor.set()
|
|
UIRectFillUsingBlendMode(drawRect, .sourceAtop)
|
|
let tintedImage: UIImage? = UIGraphicsGetImageFromCurrentImageContext()
|
|
UIGraphicsEndImageContext()
|
|
return tintedImage
|
|
}
|
|
|
|
@objc func vc_withAlpha(_ alpha: CGFloat) -> UIImage? {
|
|
UIGraphicsBeginImageContextWithOptions(size, false, scale)
|
|
draw(at: .zero, blendMode: .normal, alpha: alpha)
|
|
let newImage = UIGraphicsGetImageFromCurrentImageContext()
|
|
UIGraphicsEndImageContext()
|
|
return newImage
|
|
}
|
|
|
|
// Based on https://stackoverflow.com/a/31314494
|
|
@objc func vc_resized(with targetSize: CGSize) -> UIImage? {
|
|
let originalRenderingMode = self.renderingMode
|
|
let size = self.size
|
|
|
|
let widthRatio = targetSize.width/size.width
|
|
let heightRatio = targetSize.height/size.height
|
|
|
|
// Figure out what our orientation is, and use that to form the rectangle
|
|
let newSize: CGSize
|
|
if widthRatio > heightRatio {
|
|
newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio)
|
|
} else {
|
|
newSize = CGSize(width: size.width * widthRatio, height: size.height * widthRatio)
|
|
}
|
|
|
|
let rect = CGRect(origin: .zero, size: newSize)
|
|
|
|
UIGraphicsBeginImageContextWithOptions(newSize, false, 0)
|
|
draw(in: rect)
|
|
let newImage = UIGraphicsGetImageFromCurrentImageContext()
|
|
UIGraphicsEndImageContext()
|
|
|
|
return newImage?.withRenderingMode(originalRenderingMode)
|
|
}
|
|
|
|
@objc func vc_notRenderedImage() -> UIImage {
|
|
if let cgImage = cgImage {
|
|
return NotRenderedImage(cgImage: cgImage, scale: UIScreen.main.scale, orientation: .up)
|
|
} else if let ciImage = ciImage {
|
|
return NotRenderedImage(ciImage: ciImage, scale: UIScreen.main.scale, orientation: .up)
|
|
}
|
|
return self
|
|
}
|
|
|
|
// inline class to disable rendering
|
|
private class NotRenderedImage: UIImage {
|
|
override func withRenderingMode(_ renderingMode: UIImage.RenderingMode) -> UIImage {
|
|
return self
|
|
}
|
|
}
|
|
}
|