如何检测使用 SwiftUI 3 AsyncImage() 获取的图像的方向

mic*_*ica 5 image uiimage swiftui

我使用 AsyncImage() 获取要在视图中显示的图像。

struct Pic: View {
  var body: some View {
    let url = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents").appendingPathComponent("IMG_5328.jpeg")
    
    AsyncImage(url: url) { image in
      image
      .resizable()
 //     if(image.orientation == .right) {
 //       .rotationEffect(.degrees(90))
 //     }
      .scaledToFit()
    } placeholder: {
      Color.red
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

图像文件 (IMG_5328.jpeg) 的方向为 6(逆时针 90 度),但图像未通过自动旋转进行渲染。
我怎样才能获得手动旋转它的方向。

使用 UIImage 会自动完成此操作。

let url = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents").appendingPathComponent("IMG_5328.jpeg")  
    let imageData = try! Data(contentsOf: url!)
    let uiImage = UIImage(data: imageData)!
Run Code Online (Sandbox Code Playgroud)

Eri*_*ila -1

我遇到了同样的问题,但有一些差异,但我认为你可以使用这个解决方案。

\n

首先,添加一个扩展来检测图像方向。这不是强制性的,您可以使用局部函数或三元运算符直接进入旋转效果的视图修饰符。

\n
import SwiftUI\n\nextension UIImage {\n\n    func getRotationAngle() -> Angle {\n        switch imageOrientation {\n        case .left:\n            return Angle(degrees: 270)\n        case .leftMirrored:\n            return Angle(degrees: 270)\n         case .right:\n            return Angle(degrees: 90)\n        case .rightMirrored:\n            return Angle(degrees: 90)\n        case .down:\n            return Angle(degrees: 180)\n        case .downMirrored:\n            return Angle(degrees: 180)\n        default:\n            return Angle(degrees: 0)\n        }\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后你需要获取 UIImage。为此,您可以使用此图像选择器,或者您的替代方案也很完美。

\n
import SwiftUI\n\nstruct ImagePicker: UIViewControllerRepresentable {\n\n    @Binding var image: UIImage?\n    @Binding var imageURL: URL?\n    @Environment(\\.presentationMode) var presentationMode\n\n    class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {\n        let parent: ImagePicker\n\n        init(_ parent: ImagePicker) {\n            self.parent = parent\n        }\n    \n        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {\n            if let uiImage = info[.originalImage] as? UIImage {\n                parent.image = uiImage\n            }\n            if let imageURL = info[.imageURL] as? URL {\n                parent.imageURL = imageURL\n                // Alternative\n                //let imageData = try! Data(contentsOf: url!)\n                //parent.image = UIImage(data: imageData)!\n            }\n            parent.presentationMode.wrappedValue.dismiss()\n        }\n    }\n\n    func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {\n        let picker = UIImagePickerController()\n        picker.delegate = context.coordinator\n        return picker\n    }\n\n    func makeCoordinator() -> Coordinator {\n        Coordinator(self)\n    }\n\n    func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<ImagePicker>) {\n\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这里是实施。

\n
import SwiftUI\n\nstruct ProfileView: View {\n    \n    @State private var showingImagePicker = Bool()\n    @State private var inputImage = UIImage(systemName: "person.crop.circle")\n    @State var imageURL: URL? = nil\n    \n    var body: some View {\n        VStack(spacing: 0) {\n            Text("Your profile")\n                .foregroundColor(.white)\n                .font(.custom("VisbyCF-Heavy", size: 24))\n                .frame(maxWidth: .infinity, alignment: .leading)\n                .padding(.top, 37)\n                .padding(.bottom, 33)\n            VStack(spacing: 0) { // Picture\n                ZStack {\n                    if #available(iOS 15.0, *) {\n                        AsyncImage(\n                            url: imageURL,\n                            content: { image in\n                                image\n                                    .resizable()\n                                    .aspectRatio(contentMode: .fill)\n                                    .frame(maxWidth: 105, maxHeight: 105)\n                                    .cornerRadius(53)\n                                    .rotationEffect(inputImage?.getRotationAngle() ?? Angle(degrees: 0))\n                            }, placeholder: {\n                                Image(systemName: "person.crop.circle")\n                                    .resizable()\n                                    .aspectRatio(contentMode: .fill)\n                                    .frame(maxWidth: 105, maxHeight: 105)\n                                    .cornerRadius(53)\n                            }\n                        )\n                    }\n                    ZStack {\n                        HStack{\n                            Image(systemName: "pencil.circle")\n                                .resizable()\n                                .frame(width: 12, height: 12)\n                                .padding(5)\n                        }\n                        .frame(width: 24, height: 24)\n                        .background(Color.blue)\n                        .clipShape(Circle())\n                        .shadow(radius: 10)\n                        .onTapGesture {\n                            self.showingImagePicker = true\n                        }\n                    }\n                    .frame(maxWidth: 105,maxHeight: .infinity, alignment: .bottom)\n                    .offset(x: 35)\n                }\n                .frame(width: 105, height: 105)\n                .padding(.bottom, 7)\n                Text("Change picture")\n                    .foregroundColor(Color.white)\n                    .font(.custom("VisbyCF-Heavy", size: 14))\n                    .padding(.bottom, 32)\n            }\n            Spacer()\n        }\n        .padding([.leading, .trailing], 35)\n        .navigationBarColor(.clear)\n        .navigationBarTitle(Text("Your profile"), displayMode: .inline)\n        .sheet(isPresented: $showingImagePicker) {\n            ImagePicker(image: $inputImage, imageURL: $imageURL)\n        }\n    }\n    \n}\xc3\x8f\n
Run Code Online (Sandbox Code Playgroud)\n