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

Posted

技术标签:

【中文标题】当我将照片从照片库保存到文档时,当我阅读它时它是空白的【英文标题】:When I save a photo from photo library to Documents it is blank when I read it 【发布时间】:2016-08-12 04:30:15 【问题描述】:

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

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

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

 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,该课程就结束了。

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

@IBOutlet weak var ChosenImage: UIImageView!

而且,这是我用来读取 Documents 文件夹中图片的代码。它位于不同的视图控制器中,出口称为 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 的数据没有与文件名一起写入?我确定我错过了什么。 谢谢。

【问题讨论】:

【参考方案1】:

你不应该对像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

【讨论】:

在查看您的简单项目之前,我决定看看我是否理解您在告诉我的内容。在您的帮助下,我想出了一个可以在我的代码中使用的小函数。 func doTheImage() let path = getDocumentsDirectory() let imageWhere = (path as String) + "/" + imageList[currentImage] let image = UIImage(contentsOfFile: imageWhere) print(imageWhere) mainImage.image = image 美好的。谢谢! (它肯定没有正确显示格式。:-/)

以上是关于当我将照片从照片库保存到文档时,当我阅读它时它是空白的的主要内容,如果未能解决你的问题,请参考以下文章

三星galaxy s2总是将相机视图视为风景?

将 JTextPane 内容(图像、表格)保存在文件中

故意相机崩溃

回形针可以从S3铲斗中读取照片几何图形吗?

我正在尝试制作像应用程序一样的照片库,但是当我将位图对象添加到arraylist时,我将钳制目标GC堆从128MB到128MB

UIImage * 是 __NSCFArray 而不是 UIImage