关于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 时间functionA
,imagePaths_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
时,图片会被压缩得很好。我完全糊涂了!
答案 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")
}
}
}
}