swift - SwiftUI AspectRatio 不适用于来自相机的图像
问题描述
我不确定这是否是 SwiftUI 特定的问题。无论如何,我有一个 UIImagePickerController,我使用 UIViewControllerRepresentableProtocol 在 SwiftUI 视图中实现了它:
struct ContentView: View {
@State var showCameraView = false
@State var showImagePicker = false
@State var UserImage = Image("user")
var body: some View {
VStack {
UserImage
.resizable()
.frame(width: 200, height: 200)
.scaledToFit()
.background(Color.gray)
.cornerRadius(200)
.clipped()
Button(action: {self.showImagePicker = true}) {
Text("Choose from camera roll")
}
.padding(.top, 10)
}
.sheet(isPresented: $showImagePicker) {
ImagePicker(showImagePicker: self.$showImagePicker, pickedImage: self.$UserImage)
}
}
}
struct ImagePicker: UIViewControllerRepresentable {
@Binding var showImagePicker: Bool
@Binding var pickedImage: Image
func makeCoordinator() -> ImagePicker.Coordinator {
Coordinator(self)
}
func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
let imagePicker = UIImagePickerController()
imagePicker.delegate = context.coordinator
return imagePicker
}
func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<ImagePicker>) {
return
}
class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
var parent: ImagePicker
init(_ imagePicker: ImagePicker) {
self.parent = imagePicker
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
let uiImage = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
parent.pickedImage = Image(uiImage: uiImage)
parent.showImagePicker = false
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
parent.showImagePicker = false
}
}
}
选择不是由设备相机拍摄的图像时,它可以正常工作。但是,每次我选择相机本身拍摄的图像时,似乎都没有应用 .aspectRatio 修饰符,因为在这种情况下加载的图像的尺寸会失真。有人发现我的代码有问题或知道解决方案吗?
解决方案
有同样的问题。我使用了@ninjahamster 提出的修改版本,我根本没有调整图像大小。欢迎任何其他解决方案。
func resizeImage(image: UIImage) -> UIImage {
let width = image.size.width
let height = image.size.height
UIGraphicsBeginImageContext(CGSize(width: width, height: height))
image.draw(in: CGRect(x: 0, y: 0, width: width, height: height))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
推荐阅读
- android - 获取“java.lang.UnsatisfiedLinkError:找不到要加载的 DSO:libhermes.so”错误
- python - 找到最少的字母以获得最终值
- php - 将字符串与另一个具有动态字符串内容的字符串匹配
- sql-server - 替换 SQL Server / T-SQL 中的额外换行符
- excel - 使用 VBA 从 Excel 工作表中的列表中打开文件夹
- r - 按组返回日期范围
- angular - 可以在 setInterval() 函数中订阅 Angular Inbuilt observable 吗?
- jupyter-notebook - 如何删除 jupyter notebook 中的所有降价单元格?
- javascript - 如何从事件冒泡的孩子中删除事件侦听器
- excel-formula - 使用 Excel 公式查找评级指数之间的差异