【问题标题】:Unable to get file size for image picked using UIImagePickerController无法获取使用 UIImagePickerController 选取的图像的文件大小
【发布时间】:2019-03-20 18:49:06
【问题描述】:

我正在使用以下条件,它不会对图像执行(但对视频执行)。

if let imgUrl = info[UIImagePickerControllerReferenceURL] as? URL{

            let imgName = imgUrl.lastPathComponent
            let documentDirectory = NSTemporaryDirectory()
            let localPath = documentDirectory.appending(imgName)

            let image = info[UIImagePickerControllerOriginalImage] as! UIImage
            let data = UIImageJPEGRepresentation(image, 0.3)! as NSData
            //data.write(toFile: localPath, atomically: true)
            let photoURL = URL.init(fileURLWithPath: localPath)
            let attr: NSDictionary = try! FileManager.default.attributesOfItem(atPath: (photoURL.path)) as NSDictionary
            print("file size is :", attr.fileSize(), attr.fileSize()/1024, (attr.fileSize()/1024)/1024)
            print(photoURL)
        }

我收到错误:

线程 1:致命错误:“尝试!”表达式意外引发错误: 错误域=NSCocoaErrorDomain 代码=260 "文件“asset.JPG” 无法打开,因为没有这样的文件。” UserInfo={NSFilePath=/Users/engineering07/Library/Developer/CoreSimulator/Devices/5B35C341-204E-43F0-A2DE-199757E38835/data/Containers/Data/Application/43182136-8C82-4385-99A7-F0F30B30A785/tmp/asset. JPG, NSUnderlyingError=0x608000246360 {错误域=NSPOSIXErrorDomain Code=2 "没有这样的文件或目录"}}

我无法理解这里有什么问题或这里缺少什么。请帮助我了解如何纠正它。谢谢。

【问题讨论】:

标签: ios swift xcode


【解决方案1】:

检索URL 是正确的,但对于图像,您需要使用UIImagePickerControllerOriginalImage 键获取图像。

if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
}

【讨论】:

  • Sharad,在这种情况下如何获取文件 url 路径呢?我也需要这个路径来计算图片大小并上传到服务器?
  • 你可以在那个块里面试试这个键:UIImagePickerControllerReferenceURL
  • 嘿沙拉德,根据你的建议,我尝试实施相同的方法。它抛出如上的错误。请帮我改正。谢谢。
  • 好的,我刚刚查看了苹果文档,UIImagePickerControllerReferenceURL 已被弃用,我们应该使用 UIImagePickerControllerPHAsset。一旦我们有了资产,我们就可以得到路径。您可以参考此路径:stackoverflow.com/questions/38183613/…。让我知道这个是否奏效。也不要强迫'!事情,尝试使用 guard-let/if-let 和 do-catch
【解决方案2】:

仅当您继续使用 PHAsset 方法时,请从此代码中获取帮助。 这是我喜欢的解决方案之一:

extension MyViewController: UIImagePickerControllerDelegate {
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        dismiss(animated: true, completion: nil)
        var done = false
        if #available(iOS 11.0, *) {
            if let asset = info[UIImagePickerControllerPHAsset] as? PHAsset {
                self.processAsset(asset)
                done = true
            }
        }

        if done == false {
            guard let capturedImage = info[UIImagePickerControllerEditedImage] as? UIImage else { return }
            let authorizationStatus = PHPhotoLibrary.authorizationStatus()
            if authorizationStatus == .notDetermined {
                PHPhotoLibrary.requestAuthorization({status in
                    if status == .authorized {
                        DispatchQueue.main.async {
                            self.proceedWithImageToAsset(capturedImage)
                        }
                    } else {
                        self.showErrorAlert("Our app need your camera and photo library access to upload your specified images".localized())
                    }
                })
            }
            else if authorizationStatus == .authorized {
                DispatchQueue.main.async {
                    self.proceedWithImageToAsset(capturedImage)
                }
            }
            else {
                self.showErrorAlert("Our app need your camera and photo library access to upload your specified images".localized())
            }
        }
    }

    private func proceedWithImageToAsset(_ capturedImage:UIImage) {
        var localIdentifier:String?
        PHPhotoLibrary.shared().performChanges({
            let changeRequest = PHAssetChangeRequest.creationRequestForAsset(from: capturedImage)
            localIdentifier = changeRequest.placeholderForCreatedAsset?.localIdentifier
        }) { (success, error) in
            if success {
                if let localIdentifier = localIdentifier {
                    DispatchQueue.main.async {
                        let selectedAssetFetch = PHAsset.fetchAssets(withLocalIdentifiers: [localIdentifier], options: nil)
                        var assets = [PHAsset]()
                        selectedAssetFetch.enumerateObjects({ (asset, index, _) in
                            assets.append(asset)
                        })
                        if let firstAsset = assets.first {
                            self.processAsset(firstAsset)
                        }
                    }
                }
            }
            else {
                debugPrint(error?.localizedDescription ?? "")
            }
        }
    }

    private func processAsset(_ asset: PHAsset) {
        PHImageManager.default().requestImageData(for: asset, options: nil) { (data, _, _, _) in
            if let imageData = data {
                debugPrint(imageData.count)
            }
            else {
                debugPrint("Handle error")
            }
        }
    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        dismiss(animated: true, completion: nil)
    }
}

【讨论】:

  • 使用未声明的类型“PHAsset”。尝试导入 PhotoKit 但得到 - 没有这样的模块“PhotoKit”。如何避免这些错误。 @Devanshu
  • 尝试“导入照片”
【解决方案3】:
let data: NSData = NSData(data: UIImageJPEGRepresentation((image)!, 0.3)!)
let imageSize: Int = data.length
let imageSizeInKB: Double = Double(imageSize) / 1024.0

【讨论】:

  • 这里为什么是 0.3?你能解释一下吗?
  • 因为这是您使用的值 :),所以您将获得压缩为 0.3 的图像的图像大小(以 kb 为单位),如果由我决定,我将其保留为 1 以获得原图
  • 但我在这里得到的尺寸与图像的实际尺寸不同。有什么原因吗?
  • 你所说的“图片的真实尺寸”是什么意思?
  • 我在照片调查员中看到的尺寸与我使用 UIImagePNGRepresentation(imageValue) 得到的尺寸不同。知道为什么吗?
猜你喜欢
  • 2023-03-12
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
相关资源
最近更新 更多