ios - 如何在 ImageView Swift 中显示裁剪的图像
问题描述
我正在尝试获取图像中人脸的边界框值并裁剪边界框中的人脸。我能够成功获取并绘制边界框,但无法裁剪图像并在图像视图中显示它们。谁能指导我哪里出错了?谢谢。
import UIKit
import Vision
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// 1. Load Default Image
guard let image = UIImage(named: "anuj.jpeg") else {return}
imageView.image = image
imageView.contentMode = .scaleAspectFit
self.detectFaces(img: image)
}
@IBAction func modeSwitch(_ sender: UISwitch) {
if sender.isOn{
print("Camera Mode ON !!")
}
else{
print("Camera Mode OFF !!")
}
}
// *******************************************************************
// 2. Function to detect faces in Image and retrun Bounding Box Values
// *******************************************************************
func detectFaces(img: UIImage){
// Get Image Scaled Height
let imageScaledHeight = view.frame.width / (img.size.width) * (img.size.height)
// Create Face Detection Request
let request = VNDetectFaceRectanglesRequest { (req, err)
in
if let err = err{
print("Failed to detect faces !! \(err)")
return
}
print("Request: \(req)")
req.results?.forEach({ (res) in
// Get face observations
guard let faceObservation = res as? VNFaceObservation else {return}
// Print detected face bounding box values
print("Face Observations: \(faceObservation.boundingBox)")
// Create Bounding Box
let x = self.view.frame.width * faceObservation.boundingBox.origin.x
let width = self.view.frame.width * faceObservation.boundingBox.width
let height = imageScaledHeight * faceObservation.boundingBox.height
let y = imageScaledHeight * (1 - faceObservation.boundingBox.origin.y) - height
// Show bounding Box
let redView = UIView()
redView.backgroundColor = .red
redView.frame = CGRect(x: x, y: y, width: width, height: height)
redView.alpha = 0.4
self.view.addSubview(redView)
// Crop Face in Red View i.e. in Bounding Box and show in Image View
let crop = CGRect(x: x, y: y, width: width, height: height)
let image = img.cgImage?.cropping(to: crop)
let cropImageView = UIImageView(image: UIImage(cgImage: image!))
self.view.addSubview(cropImageView)
})
}
// Convert Image to cgImage and pass to request handler
let cgImage = img.cgImage
let handler = VNImageRequestHandler(cgImage: cgImage!, options: [:])
// Perform vision request
do{
try handler.perform([request])
}
catch let reqErr{
print("Failed to perform request: \(reqErr)")
}
}
}
解决方案
问题可能是这一行:
let image = img.cgImage?.cropping(to: crop)
这不是裁剪 UIImage 的方法,因为 UIImage 以及在屏幕上绘制的所有其他内容都有一个scale和一个方向,但 CGImage 没有。
要裁剪 UIImage,请将其绘制到适当缩放的图形图像上下文中,以便图像的所需区域落入上下文中,然后提取结果图像。
推荐阅读
- php - Angular Material 6 日期选择器未在 PHP 中转换为 Ymd 格式
- gulp - gulp 4 乙烯基-ftp 无法建立数据连接
- c# - 如何独立使用 Xamarin Profiler 来分析应用程序
- python - 石墨烯 - SqlAlchemy - 抽象属性
- maven-3 - mvn test 没有运行测试类
- angular - 我可以为 Angular 简化这个方法吗?
- ios - 如何更改 NSAttributedString 字体大小
- ruby-on-rails - rails 5 api如何修复验证响应?
- javascript - 如何显示包含颜色代码的对象?
- reactjs - 反应路由:URL 已更改,但组件中的内容未加载