'How to resize and reshape UIImage without causing any distortion?
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!
Solution 1:[1]
` 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}`
Solution 2:[2]
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
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Dandelion |
| Solution 2 | Hach3m |
