首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将图片从框架发送到iOS Swift中的示例项目?

如何将图片从框架发送到iOS Swift中的示例项目?
EN

Stack Overflow用户
提问于 2019-12-09 20:09:55
回答 2查看 425关注 0票数 5

我已经使用visionKit实现了文档扫描器。最初,我遇到了相机关闭的问题,并解决了它。现在我正在尝试发送图像后,相机解散从框架到样本项目。

我试过使用完成处理程序,但它不起作用。

以下是框架的代码:

代码语言:javascript
复制
public class A8Scan: NSObject, VNDocumentCameraViewControllerDelegate {

var imageNew: UIImage?
var statusImage: UIImageView?
private var clientView: UIViewController?
public init(_ viewController:UIViewController){

          self.clientView = viewController

   }

public func showScanner(imgData: UIImage?){

    self.createTaskController(img: imgData)

       print("Called Build")


 }

private func createTaskController(img: UIImage?){

     let scannerViewController = VNDocumentCameraViewController()
     scannerViewController.delegate = self
    self.clientView?.present(scannerViewController,animated:true,completion:  {

            self.imageNew = img

    })


 }

public func imageFromFile(result: @escaping (_ image: UIImage?) -> Void){

         //the image
    let scannerViewController = VNDocumentCameraViewController()
    scannerViewController.delegate = self
    self.clientView?.present(scannerViewController,animated:true,completion: nil)

     if imageNew != nil {

         result(imageNew)
         }
         else{
             //callback nil so the app does not pause infinitely if
             //the error != nil
         result(nil)
         }

 }

func set(image: UIImage) {

    self.statusImage?.image = image

}

public func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFinishWith scan: VNDocumentCameraScan) {
        guard scan.pageCount >= 1 else {
            controller.dismiss(animated: true)
            return
        }

        let originalImage = scan.imageOfPage(at: 0)
        let newImage = compressedImage(originalImage)
        imageNew = newImage
        set(image: imageNew!)
        print("new image::\(newImage.size)")
        controller.dismiss(animated: true, completion: nil)

//        processImage(newImage)
    }

    public func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFailWithError error: Error) {
        print(error)
        controller.dismiss(animated: true)
    }

    public func documentCameraViewControllerDidCancel(_ controller: VNDocumentCameraViewController) {
        controller.dismiss(animated: true)
    }

    func compressedImage(_ originalImage: UIImage) -> UIImage {
        guard let imageData = originalImage.jpegData(compressionQuality: 1),

            let reloadedImage = UIImage(data: imageData) else {

                return originalImage
        }
        return reloadedImage
    }

 }

以下是代码示例项目:

代码语言:javascript
复制
     @IBAction func btnAction(_ sender: Any) {

 //        A8Scan(self).showScanner()
 //        A8Scan(self).showScanner(imgData: im)
 //        print("nn", A8Scan(self).showScanner(imgData: im))

    A8Scan(self).imageFromFile { (image) in

        if image != nil {

            print(image!)
        } else {

            print("something went wrong")
        }
    }
//        p()
}

func p (){
    ScannerViewController().imageFromFile{(image: UIImage?) -> Void in
        //use the image that was just retrieved

        print("image data", image)
    }
}

我的问题是在相机从框架中移除后,它不会将图像从框架发送到示例项目。

任何帮助,非常感谢.

EN

回答 2

Stack Overflow用户

发布于 2019-12-09 20:21:25

1-将此代码添加到框架中

代码语言:javascript
复制
var callBack((UIImage)-())?

 public func show() { 
   let scannerViewController = VNDocumentCameraViewController()
   scannerViewController.delegate = self 
   self.clientView?.present(scannerViewController,animated:true,completion: nil)
}

2-

代码语言:javascript
复制
let newImage = compressedImage(originalImage)
callBack?(newImage)

3-

然后在使用它的vc内部。

代码语言:javascript
复制
let vc = A8Scan(self)
vc.show()
vc.callBack = { [weak self] image in

}
票数 3
EN

Stack Overflow用户

发布于 2019-12-17 19:44:47

因为您正在使用中间人(A8Scan) NSObject来呈现控制器。在呈现控制器之后,A8Scan将立即被释放,您可以通过在A8Scan中保留deinit函数来确认这一点。

一种解决方法是将您的NSObject (A8Scan)设置为单例即添加

代码语言:javascript
复制
static let shared = A8Scan()
var callBack: ((_ image: UIImage?) -> Void)?

删除现有的初始化方法并将viewcontroller属性添加到imageFromFile:方法中,您的函数将如下所示

代码语言:javascript
复制
public func imageFromFile(sender: UIViewController, result: @escaping (_ image: UIImage?) -> Void){
   let scannerViewController = VNDocumentCameraViewController()
   scannerViewController.delegate = self
   self.callBack = result
   sender.present(scannerViewController,animated:true,completion: nil)
}

public func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFinishWith scan: VNDocumentCameraScan) {
    guard scan.pageCount >= 1 else {
        controller.dismiss(animated: true)
        return
    }

    let originalImage = scan.imageOfPage(at: 0)
    let newImage = compressedImage(originalImage)
    imageNew = newImage
    set(image: imageNew!)
    callBack?(imageNew!)
    controller.dismiss(animated: true, completion: nil)
}

最后,在您的示例项目中,

代码语言:javascript
复制
 @IBAction func btnAction(_ sender: Any) {
  A8Scan.shared.imageFromFile(sender: self) { (image) in
     if image != nil {
         print(image!)
     } else {
         print("something went wrong")
     }
   }
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59248664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档