ios - 当我将照片从照片库保存到文档时,我读取它时它是空白的

标签 ios swift uiimageview uiimage

我知道我一定在这段代码中遗漏了一些东西。如果已经被问过,我不知道要搜索什么词。我搜索了有关在空白或空的文档文件夹中读取图片的信息。我知道它不是 nil,因为 Xcode 说对于该类型 (UIImage) 它不能是 nil。

我可以使用 imagepicker 获取图片并将其显示在 UIImageView 中。当我将 UIImage 保存到 Documents 文件夹中时,没有错误。但是,当我读取保存的图像并尝试在 UIImageView 中显示它时,图片是空白的或空的(它只显示 View 的背景颜色。)

我可以将应用程序内容文件夹中的一些图片复制到文档文件夹中,并且它们可以正常显示。我检查并在整个代码中添加了打印语句,以查看是否有一个地方代码被跳过。我什至编写了一个函数来列出文档文件夹中的文件名。图片的名称在那里,但是我要保存的图片的数据似乎没有写入。

 func addNewPhoto() {
    gotAPicture = true
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary) {
        let picker = UIImagePickerController()
        picker.modalPresentationStyle = .CurrentContext
        picker.allowsEditing = false
        picker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
        picker.delegate = self

        presentViewController(picker, animated: true, completion: nil)
    }
}


func imagePickerControllerDidCancel(picker: UIImagePickerController) {
    dismissViewControllerAnimated(true, completion: nil)
}

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    var newImage: UIImage
    if let possibleImage = info[UIImagePickerControllerEditedImage] as? UIImage {

        newImage = possibleImage
    } else if let possibleImage = info[UIImagePickerControllerOriginalImage] as? UIImage {

        newImage = possibleImage
    } else {

        return
    }

    let imageName = NSUUID().UUIDString + ".jpg"
    let imagePath = getDocumentsDirectory().stringByAppendingPathComponent(imageName)

    if let pictureData = UIImageJPEGRepresentation(newImage, 0.9) {
        pictureData.writeToFile(imagePath, atomically: true)
    }

    ChosenImage.image = newImage

    picker.dismissViewControllerAnimated(true, completion: nil)
    picker.delegate = nil
}

func getDocumentsDirectory() -> NSString {
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    let documentsDirectory = paths[0]
    return documentsDirectory
}

我检查了代码,重写了它,然后从头开始。我什至在第 10 课(以及其他教程)中遵循了 hackingwithswift.com 的编码示例。当我将 .allowsEditing 更改为 false 后,该类(class)就开始起作用了。

好的,这是我用来显示图片的代码

@IBOutlet weak var ChosenImage: UIImageView!

而且,这是我用来读取“文档”文件夹中的图片的代码。它位于不同的 View Controller 中,导出称为 mainImage。

let fm = NSFileManager.defaultManager()
    let path = getDocumentsDirectory()
    let items = try! fm.contentsOfDirectoryAtPath(path as String)

    imageList.removeAll()
    currentImage = 0

    for item in items {
        if item.hasSuffix(".jpg") {
            imageList.append(item)
            }
    }

    mainImage.image = UIImage(named: imageList[currentImage])

    let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.swipeRight(_:)))
    swipeRight.direction = .Right
    self.view.addGestureRecognizer(swipeRight)

    let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.swipeLeft(_:)))
    swipeLeft.direction = .Left
    self.view.addGestureRecognizer(swipeLeft)

    let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.swipeUp(_:)))
    swipeUp.direction = .Up
    self.view.addGestureRecognizer(swipeUp)

是什么导致 UIImage 的数据未与文件名一起写入?我确信我错过了什么。 谢谢。

最佳答案

您不应该对像let image = UIImage(named: <#imageName#>)这样的图像使用这种初始化。 ,因为这种初始化最好仅用于应用程序包中存在的图像。我想你会适合像
let image = UIImage(contentsOfFile: <#imagePath#>) 这样的方法为了清除您加载图像,请您尽早坚持。

但是,你的问题很简单,当你获取目录的内容时,输出会像这样

21AB15AE-D69A-416B-AE93-6DC334E41F91.jpg 6CB9FA7B-FF20-4D60-B7EB-B44300C85AF9.jpg 86508AEC-AE8B-4FB8-8CA5-307DF58E959A.jpg 9C90944E-87EE-4B41-BA99-A6A8171402AC.jpg AC2BC0D4-CA51-4A24-9D80-87F8736A72A7.jpg B0C772A6-8354-4C7C-B23B-7414123E52FB.jpg B10FE95C-E017-411C-BAD1-986A6090F463.jpg DCB4B0C9-DDB4-4188-8DF7-0ABFD2FD76CB.jpg EEDDCABD-A707-4CAA-9AF7-5009EAA57FA8.jpg等等...

这导致了主要问题 - 您尝试仅通过引用图像名称来加载图像,结果会产生 nil-image 。要加载图像,您应该指定图像的完整路径(完整路径适用于 contentsOfURLnamed 初始值设定项)

我会创建一个简单的项目,你可以得到它 here

关于ios - 当我将照片从照片库保存到文档时,我读取它时它是空白的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38909941/

相关文章:

javascript - WKWebView 返回(_ :) evaluateJavaScript Fails if going back more than 2 in history

ios - 蒙面的 UIVisualEffectView 在 iOS 10 上不起作用

ios - 为什么弹出 UIViewController 会改变 navigationItem 的 titleTextAttributes?

iphone - 增加/减少 UIImageView 的亮度

iPhone页面 curl 过渡动画

html - iPhone 上 Unicode 复选标记 2714 的颜色没有改变

ios - WatchKit 应用程序不包含 Watch OS 3.0 中的任何 WatchKit 扩展

swift - swift 1.2 中的 "unexpectedly found nil while unwrapping an Optional value"

ios - Swift iOS 尝试动态更改 UITextAutocapitalization 类型

objective-c - UIImageView 的 UIImage 为零