簡體   English   中英

SwiftUI iOS 中圖像裁剪的最佳庫?

[英]Best library for image cropping in SwiftUI iOS?

我正在使用 iOS SwiftUI 應用程序圖像編輯器,為了圖像裁剪,我使用了Mantis庫,但我遇到了一個問題,當我從圖庫中選擇圖像時,它工作得很好,但是當通過相機選擇圖像時,應用程序崩潰了。收到此錯誤消息“來自調試器:由於內存問題而終止

通過包管理器安裝 Mantis 庫鏈接

我發現的其他庫是QCropper ,但它沒有任何 SwiftUI 文檔

我的代碼:主頁

import SwiftUI
import Mantis

struct HomePage: View {
    
    @State var bgImage :UIImage?
    @State var camIsClicked = false
    @State private var isImagePickerDisplay = false
    @State var sourceType: UIImagePickerController.SourceType?
    @State var showCropper = false
    
    @State var gotoImageEdit = false
    @State private var cropShapeType: Mantis.CropShapeType = .rect
    @State private var presetFixedRatioType: Mantis.PresetFixedRatioType = .canUseMultiplePresetFixedRatio()
    var camAlertView:some View{
        VStack {
            VStack{
                VStack(spacing:Constants.device == .pad ? 20:10){
                    Text("Select One!")
                        .foregroundColor(Color.red)
                        .fontWeight(.bold)
                        .font(Constants.device == .pad ? .largeTitle:.title2)
                    Divider()
                        .frame(width:Constants.width*0.65 , height:Constants.device == .pad ? 3.5:2)
                        .background(Color.red)
                }
                .padding(.top)
                Spacer()
                Button {
                    sourceType = .photoLibrary
                    isImagePickerDisplay.toggle()
                } label: {
                    Text("Gallery")
                        .fontWeight(.bold)
                        .font(Constants.device == .pad ? .title:.title3)
                        .frame(width:Constants.width*0.34, height:Constants.device == .pad ? 70:40)
                        .background(Color.red)
                        .cornerRadius(Constants.device == .pad ? 35:20)
                }
                Spacer()
                Button {
                    sourceType = .camera
                    isImagePickerDisplay.toggle()
                } label: {
                    Text("Camera")
                        .fontWeight(.bold)
                        .font(Constants.device == .pad ? .title:.title3)
                        .frame(width:Constants.width*0.34, height:Constants.device == .pad ? 70:40)
                        .background(Color.red)
                        .cornerRadius(Constants.device == .pad ? 35:20)
                    
                }
                Spacer()
            }
            .frame(width:Constants.width*0.65, height:Constants.height*0.39)
            .background(Color.white)
            .cornerRadius(20)
            .foregroundColor(.white)
        }
        .frame(width:Constants.width, height:Constants.height)
        .background(Color.black
                        .opacity(0.8)
                        .ignoresSafeArea()
                        .onTapGesture {
            camIsClicked = false
        })
    }
    var body: some View {
        ZStack{
            NavigationLink( destination: ImageEditPage(bgImage: $bgImage),isActive: $gotoImageEdit) {
                EmptyView()
            }
            VStack{
                Button {
                    camIsClicked.toggle()
                } label: {
                    Text("Pick Image")
                        .padding()
                        .background(Color.green)
                        .cornerRadius(30)
                }
            }
            if camIsClicked{
                camAlertView
            }
            if isImagePickerDisplay{
                if sourceType == .photoLibrary{
                    SUImagePickerView(sourceType: .photoLibrary, image: $bgImage, isPresented: $isImagePickerDisplay, camIsClicked: $camIsClicked, bgImageIsSelected: $showCropper)
                }else{
                    SUImagePickerView(sourceType: .camera, image: $bgImage, isPresented: $isImagePickerDisplay, camIsClicked: $camIsClicked, bgImageIsSelected: $showCropper)
                }
            }
        }
        .navigationBarHidden(true)
        .fullScreenCover(isPresented: $showCropper, content: {
            ImageCropper(gotoImageEdit: $gotoImageEdit, image: $bgImage,cropShapeType: $cropShapeType,presetFixedRatioType: $presetFixedRatioType)
                .ignoresSafeArea()
        })
    }
}

struct HomePage_Previews: PreviewProvider {
    static var previews: some View {
        HomePage()
    }
}

ImageCropper 類

import SwiftUI
import Mantis

struct ImageCropper: UIViewControllerRepresentable {
    @Binding var gotoImageEdit : Bool
    @Binding var image: UIImage?
    @Binding var cropShapeType: Mantis.CropShapeType
    @Binding var presetFixedRatioType: Mantis.PresetFixedRatioType
    @Environment(\.presentationMode) var presentationMode

    class Coordinator: CropViewControllerDelegate {
        func cropViewControllerDidImageTransformed(_ cropViewController: CropViewController) {

        }

        var parent: ImageCropper

        init(_ parent: ImageCropper) {
            self.parent = parent
        }

        func cropViewControllerDidCrop(_ cropViewController: CropViewController, cropped: UIImage, transformation: Transformation, cropInfo: CropInfo) {
            parent.image = cropped
            print("transformation is \(transformation)")
            parent.gotoImageEdit = true
            parent.presentationMode.wrappedValue.dismiss()
        }

        func cropViewControllerDidCancel(_ cropViewController: CropViewController, original: UIImage) {
            parent.presentationMode.wrappedValue.dismiss()
        }

        func cropViewControllerDidFailToCrop(_ cropViewController: CropViewController, original: UIImage) {
        }

        func cropViewControllerDidBeginResize(_ cropViewController: CropViewController) {
        }

        func cropViewControllerDidEndResize(_ cropViewController: CropViewController, original: UIImage, cropInfo: CropInfo) {
        }
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIViewController(context: Context) -> CropViewController {
        var config = Mantis.Config()
        config.cropViewConfig.cropShapeType = cropShapeType
        config.presetFixedRatioType = presetFixedRatioType
        let cropViewController = Mantis.cropViewController(image: image!,
                                                           config: config)
        cropViewController.delegate = context.coordinator
        return cropViewController
    }

    func updateUIViewController(_ uiViewController: CropViewController, context: Context) {

    }
}

我認為這是螳螂庫最新版本中的一個錯誤。 我有同樣的問題。 我安裝了 2.1.2 版,它似乎可以工作。 您的代碼看起來不錯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM