我获得了1920x1080分辨率的图像。我试图将它们裁剪到中心广场区域(即中心的1080x1080平方)。该决议可能在未来发生变化。是否可以通过这种方式裁剪图像?我已尝试在SO上发布了一些东西,但如果我尝试裁剪然后居中,我总会得到660x1080的图像。这是描绘我想要实现的目标的图像。
基本上红色是原始的,绿色是我想要的,黄色只是显示mixX和midY线。
我试过的代码。
func imageByCroppingImage(image: UIImage, toSize size: CGSize) -> UIImage{
let newCropWidth: CGFloat?
let newCropHeight: CGFloat?
if image.size.width < image.size.height {
if image.size.width < size.width {
newCropWidth = size.width
} else {
newCropWidth = image.size.width
}
newCropHeight = (newCropWidth! * size.height) / size.width
} else {
if image.size.height < size.height {
newCropHeight = size.height
} else {
newCropHeight = image.size.height
}
newCropWidth = (newCropHeight! * size.width) / size.height
}
let x = image.size.width / 2.0 - newCropWidth! / 2.0
let y = image.size.height / 2.0 - newCropHeight! / 2.0
let cropRect = CGRect(x: x, y: y, width: newCropWidth!, height: newCropHeight!)
let imageRef = image.cgImage!.cropping(to: cropRect)
let cropped = UIImage(cgImage: imageRef!, scale: 1.0, orientation: .right)
return cropped
}
然后我将该方法传递给CGSize(1080,1080)。我得到的图像是660,1080。有什么想法吗?
目的是裁剪图像,而不只是将图像居中显示。
答案 0 :(得分:3)
您可以使用我在此answer中使用的相同方法,而不使用行UIBezierPath(ovalIn: breadthRect).addClip()
extension UIImage {
var isPortrait: Bool { return size.height > size.width }
var isLandscape: Bool { return size.width > size.height }
var breadth: CGFloat { return min(size.width, size.height) }
var breadthSize: CGSize { return CGSize(width: breadth, height: breadth) }
var breadthRect: CGRect { return CGRect(origin: .zero, size: breadthSize) }
var squared: UIImage? {
UIGraphicsBeginImageContextWithOptions(breadthSize, false, scale)
defer { UIGraphicsEndImageContext() }
guard let cgImage = cgImage?.cropping(to: CGRect(origin: CGPoint(x: isLandscape ? floor((size.width - size.height) / 2) : 0, y: isPortrait ? floor((size.height - size.width) / 2) : 0), size: breadthSize)) else { return nil }
UIImage(cgImage: cgImage).draw(in: breadthRect)
return UIGraphicsGetImageFromCurrentImageContext()
}
}
let imageURL = URL(string: "https://www.sample.com/yourImage.jpg")!
let image = UIImage(data: try! Data(contentsOf: imageURL))!
let squared = image.squared