I am using the clearbit api to get and display company logos in my app. This works great except that all of the logos are different size, and I want them all to be displayed as a square.
Does anybody know how to take a rectangular image and add extra pixels to it of a given color until it becomes square with the logo at the center?
This question seemed to answer it, but it is outdated. I also thought that the top answer on this question would work, but the code didn't work. Any help would be very much appreciated, thank you!
` func drawImageOnCanvas(_ useImage: UIImage, canvasColor: UIColor ) -> UIImage {
let length = max(useImage.size.width, useImage.size.height)
let canvasSize = CGSize.init(width: length, height: length)
let rect = CGRect(origin: .zero, size: canvasSize)
UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
// fill the entire image
canvasColor.setFill()
UIRectFill(rect)
// calculate a Rect the size of the image to draw, centered in the canvas rect
let centeredImageRect = CGRect(x: (canvasSize.width - useImage.size.width) / 2,
y: (canvasSize.height - useImage.size.height) / 2,
width: useImage.size.width,
height: useImage.size.height)
// get a drawing context
let context = UIGraphicsGetCurrentContext();
// "cut" a transparent rectanlge in the middle of the "canvas" image
context?.clear(centeredImageRect)
// draw the image into that rect
useImage.draw(in: centeredImageRect)
// get the new "image in the center of a canvas image"
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image!
}`
` func imageWithColor(color : UIColor,oriImage:UIImage) -> UIImage{
let length = max(oriImage.size.width, oriImage.size.height)
let size = CGSize.init(width: length, height: length)
let imgView = UIImageView.init(image: oriImage)
imgView.contentMode = UIView.ContentMode.scaleAspectFit
imgView.backgroundColor = color
imgView.bounds = CGRect.init(x: 0, y: 0, width: length, height: length)
print("\(size.width)" + "\(size.height)")
UIGraphicsBeginImageContext(size)
guard let context = UIGraphicsGetCurrentContext() else{
print("context get Error")
return oriImage
}
imgView.layer.render(in:context)
let desImg = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return desImg ?? oriImage
}`
import UIKit
extension UIImage {
func scalePreservingAspectRatio(targetSize: CGSize) -> UIImage {
// Determine the scale factor that preserves aspect ratio
let widthRatio = targetSize.width / size.width
let heightRatio = targetSize.height / size.height
let scaleFactor = min(widthRatio, heightRatio)
// Compute the new image size that preserves aspect ratio
let scaledImageSize = CGSize(
width: size.width * scaleFactor,
height: size.height * scaleFactor
)
// Draw and return the resized UIImage
let renderer = UIGraphicsImageRenderer(
size: scaledImageSize
)
let scaledImage = renderer.image { _ in
self.draw(in: CGRect(
origin: .zero,
size: scaledImageSize
))
}
return scaledImage
}
}