iOS 自定义 UIImagePickerController 相机裁剪为正方形

ios

1个回答

写回答

Susie123

2025-06-17 06:40

+ 关注

IOS
IOS

IOS开发中,使用UIImagePickerController进行相机拍照功能是非常常见的。然而,默认情况下,UIImagePickerController拍摄的照片是以全屏的形式呈现的,而有时候我们需要将照片裁剪成正方形,以适应特定的需求。本文将介绍如何通过自定义UIImagePickerController来实现相机照片的正方形裁剪,并提供相关代码示例。

步骤一:自定义UIImagePickerController

首先,我们需要自定义一个UIImagePickerController,以便在拍摄照片时进行裁剪。我们可以创建一个继承自UIImagePickerController的子类,并在该子类中实现相应的功能。

Swift

import UIKit

class SquareImagePickerController: UIImagePickerController {

override func viewDidLoad() {

super.viewDidLoad()

// 设置裁剪框的宽高比为1:1

self.showsCameraControls = false

self.aspectRatioLockEnabled = true

self.cameraDevice = .rear

self.cameraCaptureMode = .photo

self.cameraFlashMode = .auto

self.cameraOverlayView = createOverlayView()

}

// 创建裁剪框视图

private func createOverlayView() -> UIView {

let overlayView = UIView()

overlayView.backgroundColor = UIColor.clear

// 设置裁剪框的大小和位置

let screenWidth = UIScreen.mAIn.bounds.width

let screenHeight = UIScreen.mAIn.bounds.height

let squareSize = min(screenWidth, screenHeight)

let overlaySize = CGSize(width: squareSize, height: squareSize)

let overlayOrigin = CGPoint(x: (screenWidth - squareSize) / 2, y: (screenHeight - squareSize) / 2)

overlayView.frame = CGRect(origin: overlayOrigin, size: overlaySize)

// 添加裁剪框边框

let borderLayer = CAShapeLayer()

borderLayer.strokeColor = UIColor.white.cgColor

borderLayer.fillColor = UIColor.clear.cgColor

borderLayer.lineWidth = 2.0

borderLayer.path = UIBezierPath(rect: CGRect(x: 0, y: 0, width: squareSize, height: squareSize)).cgPath

overlayView.layer.addSublayer(borderLayer)

return overlayView

}

}

在自定义的SquareImagePickerController中,我们首先设置了裁剪框的宽高比为1:1,然后隐藏了相机的控制按钮,设置相机的相关属性,并创建了一个裁剪框视图。裁剪框视图是一个透明的UIView,用于显示裁剪框,并添加了一个白色的边框。

步骤二:使用自定义的UIImagePickerController

接下来,我们需要使用自定义的SquareImagePickerController来进行相机拍照,并获取裁剪后的正方形照片

Swift

import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

override func viewDidLoad() {

super.viewDidLoad()

}

@IBAction func openCameraButtonTapped(_ sender: UIButton) {

let imagePicker = SquareImagePickerController()

imagePicker.delegate = self

imagePicker.sourceType = .camera

present(imagePicker, animated: true, completion: nil)

}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

picker.dismiss(animated: true, completion: nil)

if let pickedImage = info[.originalImage] as? UIImage {

let croppedImage = cropImageToSquare(image: pickedImage)

// 在这里可以对裁剪后的照片进行进一步处理

}

}

func cropImageToSquare(image: UIImage) -> UIImage {

let screenWidth = UIScreen.mAIn.bounds.width

let screenHeight = UIScreen.mAIn.bounds.height

let squareSize = min(screenWidth, screenHeight)

let imageSize = image.size

let imageSizeScale = max(imageSize.width / screenWidth, imageSize.height / screenHeight)

let scaledImageSize = CGSize(width: imageSize.width / imageSizeScale, height: imageSize.height / imageSizeScale)

let imageOrigin = CGPoint(x: (scaledImageSize.width - squareSize) / 2, y: (scaledImageSize.height - squareSize) / 2)

let imageRect = CGRect(origin: imageOrigin, size: CGSize(width: squareSize, height: squareSize))

if let imageRef = image.cgImage?.cropping(to: imageRect) {

return UIImage(cgImage: imageRef, scale: image.scale, orientation: image.imageOrientation)

}

return image

}

}

在ViewController中,我们首先创建了一个SquareImagePickerController的实例,并设置其代理为当前的ViewController。然后,在点击打开相机按钮时,我们使用present方法来显示自定义的相机界面。当用户拍摄完照片后,我们在imagePickerController的回调方法中获取到拍摄的原始照片,并调用cropImageToSquare方法对照片进行裁剪。

通过自定义UIImagePickerController并实现相应的裁剪逻辑,我们可以实现相机拍摄照片的正方形裁剪。本文提供了自定义UIImagePickerController的代码示例,并演示了如何在ViewController中使用该自定义相机,并获取裁剪后的照片。希望本文对于需要在IOS应用中实现相机照片正方形裁剪的开发者们有所帮助。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号