当在Swift中删除指定路径的文件时,UIImageJPEGRepresentation返回nil?

时间:2017-06-04 03:44:46

标签: ios swift uiimagejpegrepresentation

关于UIImageJPEGRepresentation如何与Documents目录中的文件路径相关,我感到很困惑。

基本上,当我从文件路径中删除文件,然后在UIImageJPEGRepresentation上调用UIImage时,它返回nil,但如果文件路径未被删除,UIImageJPEGRepresentation将返回图像的数据表示。

这是我的示例代码,用于演示我的意思:

func functionA()
{
    if imagePaths_ARRAY.isEmpty == false
    {
        for pathToDelete in imagePaths_ARRAY
        {
            if fileManager.fileExists(atPath: pathToDelete)
            {
                do
                {
                    try fileManager.removeItem(atPath: pathToDelete)
                }
                catch let error as NSError
                {
                    print(error.localizedDescription)
                }
            }
            else
            {
                print("ERROR")
            }
        }

        imagePaths_ARRAY.removeAll()
    }

    print(images_ARRAY)

    for image in images_ARRAY
    {
        print(image)

        if let imageData = UIImageJPEGRepresentation(image, 0.5)
        {
            print("RETURN GOOD")
            let imageName = getImageName()

            let imagePath = getDirectoryPath().appending("/" + imageName)

            let success = fileManager.createFile(atPath: imagePath, contents: imageData, attributes: nil)

            if success == true
            {
                imagePaths_ARRAY.append(imagePath)
            }
        }
        else
        {
            print("RETURN NIL")
        }

    }
}

调用 FIRST 时间functionAimagePaths_ARRAY为空,因此内部代码块不会执行。我循环遍历UIImages数组,对于每个图像,我调用UIImageJPEGRepresentation将其转换为Data对象以写入文件,然后将imagePath添加到我的imagePaths_ARRAY数组将在我的代码中的其他地方使用。

对于每张图片,我都会看到RETURN GOOD的日志,所有图片都会写入文件。

但是,当functionA被称为 SECOND 时,imagePaths_ARRAY不为空,因此我会删除imagePaths_ARRAY中路径中的所有文件。< / p>

但是当再次在UIImageJPEGRepresentation上调用image时,它会返回nil?

我对为什么感到困惑,因为image中的每个images_ARRAY都给了我一个有效的UIImage

[<UIImage: 0x600000085280> size {4288, 2848} orientation 0 scale 1.000000]

如第一句中所述,我想知道如何使用removeItem删除文件会导致UIImageJPEGRepresentation返回nil?

更新:当我用UIImageJPEGRepresentation替换UIImagePNGRepresentation时,图片会被压缩得很好。我完全糊涂了!

1 个答案:

答案 0 :(得分:0)

看起来像必须在你的代码中继续进行。

我刚试了一下,用下面的代码我可以反复点击按钮,每次通过我都会成功:

//
//  TestViewController.swift
//

import UIKit

class TestViewController: UIViewController {

    var imagePaths_ARRAY = [String]()
    var images_ARRAY = [UIImage]()

    let fileManager = FileManager.default

    override func viewDidLoad() {
        super.viewDidLoad()

        let names = ["s1", "s2", "s3"]

        for s in names {
            if let img = UIImage(named: s) {
                images_ARRAY.append(img)
            }
        }
    }

    @IBAction func btnTapped(_ sender: Any) {
        functionA()
    }


    func getDirectoryPath() -> String {
        return NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
    }

    func getImageName() -> String {
        let randomNum:UInt32 = arc4random_uniform(1000000)
        return "randomName_\(randomNum)"
    }

    func functionA()
    {

        print(imagePaths_ARRAY)

        if imagePaths_ARRAY.isEmpty == false
        {
            for pathToDelete in imagePaths_ARRAY
            {
                if fileManager.fileExists(atPath: pathToDelete)
                {
                    do
                    {
                        try fileManager.removeItem(atPath: pathToDelete)
                    }
                    catch let error as NSError
                    {
                        print(error.localizedDescription)
                    }
                }
                else
                {
                    print("ERROR")
                }
            }

            imagePaths_ARRAY.removeAll()
        }

        print(images_ARRAY)

        for image in images_ARRAY
        {
//          print(image)

            if let imageData = UIImageJPEGRepresentation(image, 0.5)
            {
                let imageName = getImageName()

                let imagePath = getDirectoryPath().appending("/" + imageName)

                let success = fileManager.createFile(atPath: imagePath, contents: imageData, attributes: nil)

                if success == true
                {
                    print("RETURN GOOD")
                    imagePaths_ARRAY.append(imagePath)
                }
            }
            else
            {
                print("RETURN NIL")
            }

        }

    }

}