123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- //
- // SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
- // SPDX-License-Identifier: GPL-3.0-or-later
- //
- import UIKit
- extension UIImage {
- // Function to overlay an image on top of the current image
- @objc func overlay(with overlayImage: UIImage, at overlayRect: CGRect) -> UIImage? {
- // Calculate the new size for the resulting image
- let newWidth = max(self.size.width, overlayRect.origin.x + overlayRect.size.width)
- let newHeight = max(self.size.height, overlayRect.origin.y + overlayRect.size.height)
- let newSize = CGSize(width: newWidth, height: newHeight)
- // Begin a new image context with the new size.
- UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
- // Draw the base image in its original position.
- self.draw(in: CGRect(origin: CGPoint.zero, size: self.size))
- // Draw the overlay image in the specified rectangle.
- overlayImage.draw(in: overlayRect)
- // Capture the new image from the context.
- let newImage = UIGraphicsGetImageFromCurrentImageContext()
- // End the image context to free up memory.
- UIGraphicsEndImageContext()
- return newImage
- }
- // Function to crop an image into a circle with the specified size.
- @objc func cropToCircle(withSize size: CGSize) -> UIImage? {
- // Begin a new image context with the target size
- UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
- // Create a circular path using a rounded rectangle
- let rect = CGRect(origin: .zero, size: size)
- let path = UIBezierPath(roundedRect: rect, cornerRadius: size.width / 2)
- path.addClip()
- // Draw the image in the context, scaled to fill the entire circular area
- self.draw(in: rect)
- // Capture the new image
- let circleImage = UIGraphicsGetImageFromCurrentImageContext()
- // End the image context to free up memory
- UIGraphicsEndImageContext()
- return circleImage
- }
- // Function to add a circular background with specified background color, diameter and padding
- @objc func withCircularBackground(backgroundColor: UIColor, diameter: CGFloat, padding: CGFloat) -> UIImage? {
- // Begin a new image context with the target diameter as both width and height
- UIGraphicsBeginImageContextWithOptions(CGSize(width: diameter, height: diameter), false, 0.0)
- // Define the circle's path using the diameter
- let circlePath = UIBezierPath(ovalIn: CGRect(origin: .zero, size: CGSize(width: diameter, height: diameter)))
- // Set the fill color and fill the circle
- backgroundColor.setFill()
- circlePath.fill()
- // Calculate the frame for the image inside the circle
- let imageSize = CGSize(width: diameter - 2 * padding, height: diameter - 2 * padding)
- let imageRect = CGRect(
- x: (diameter - imageSize.width) / 2,
- y: (diameter - imageSize.height) / 2,
- width: imageSize.width,
- height: imageSize.height
- )
- // Draw the image inside the calculated frame
- self.draw(in: imageRect)
- // Capture the final image
- let resultImage = UIGraphicsGetImageFromCurrentImageContext()
- // End the image context to free up memory
- UIGraphicsEndImageContext()
- return resultImage
- }
- // Function to create a UIImage from a UILabel
- @objc static func image(from label: UILabel) -> UIImage? {
- // Begin a new image context with the size of the label
- UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0.0)
- // Render the label layer into the current context
- label.layer.render(in: UIGraphicsGetCurrentContext()!)
- // Capture the image from the context
- let image = UIGraphicsGetImageFromCurrentImageContext()
- // End the image context to free up memory
- UIGraphicsEndImageContext()
- return image
- }
- }
|