我对UIImageJPEGRepresentation
与文件目录中的文件路径有何关系完全困惑。
基本上,当我从文件路径删除文件时,然后在UIImage
上调用UIImageJPEGRepresentation
时,它将返回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")
}
}
}
非常第一个时间 functionA
被调用, imagePaths_ARRAY
是空的,因此代码的内部块不执行。我在UIImages
的数组中循环,对于每个图像,我致电UIImageJPEGRepresentation
将其转换为Data
对象以写入文件,然后将imagePath
添加到我的imagePaths_ARRAY
数组中,以在我的代码中使用。
对于每个图像,我看到RETURN GOOD
的日志,所有图像都写入文件。
但是,当functionA
称为 second 时间时,imagePaths_ARRAY
不是空的,因此我从imagePaths_ARRAY
中的路径中删除所有文件。
但是,当UIImageJPEGRepresentation
再次在image
上调用时,它返回nil?
我对为什么感到完全困惑,因为images_ARRAY
中的每个image
都给我一个有效的UIImage
:
[<UIImage: 0x600000085280> size {4288, 2848} orientation 0 scale 1.000000]
如第一句话所述,我想知道如何使用removeItem
删除文件会导致UIImageJPEGRepresentation
返回nil?
更新:当我用UIImagePNGRepresentation
替换UIImageJPEGRepresentation
时,图像被压缩了。我完全困惑!
似乎在您的代码中必须必须进行。
我只是尝试了一下,使用以下代码,我可以反复点击按钮,每次我都能获得成功:
//
// 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")
}
}
}
}