iOS和Swift - 如何从用户获取并保存UIImage?

9

我正在为iOS编写一款Swift应用程序。我想知道如何从用户的相机胶卷(或者现在他们叫它什么)中获取图像,并在应用程序内部将其保存到本地,以便稍后可以引用它。怎样才能做到这一点呢?例如,假设我想获取该图像并将其设置为Storyboard中UIImageView的图像。


查找ALAssetsLibrary。 - Abizern
我认为这个链接会对你有很大帮助 在这里查看 - Saurabh Prajapati
5个回答

5
这正是使用UIImagePickerControllerNSUserDefaults结合的作用。
对于你来说,这将是一个两部分的任务。首先,您需要使用UIImagePickerController捕获图像,然后将其存储在照片库中,或使用NSUserDefaults将其存储在设备上。
要使用NSUserDefaults存储图像,请参见此问题

12
用户默认设置用于图片?真的吗? - Abizern
这仍然是一个不好的想法。你可以将图像存储在本地沙盒中,并使用更适当的持久性机制引用它们。 - Abizern
1
你应该通过文件管理器或核心数据来持久化图像。 - rjgonzo

4
这里是我的组合。
保存图片:
let imageData = NSData(data:UIImagePNGRepresentation(pickedimage))
let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
var docs: String = paths[0] as! String
let fullPath = docs.stringByAppendingPathComponent("yourNameImg.png")
let result = imageData.writeToFile(fullPath, atomically: true)

print(fullPath)

获取图像:

let nsDocumentDirectory = NSSearchPathDirectory.DocumentDirectory
let nsUserDomainMask    = NSSearchPathDomainMask.UserDomainMask
if let paths            = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)
{
    if paths.count > 0
    {
        if let dirPath = paths[0] as? String
        {
            let readPath = dirPath.stringByAppendingPathComponent("yourNameImg.png")
            let image    = UIImage(contentsOfFile: readPath)

            UploadImagePreview.image = image
        }
    }
}

我们可以使用Photos Framework来获取最近保存的图片。
var fetchOptions: PHFetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]

var fetchResult = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: fetchOptions)

if (fetchResult.firstObject != nil) {
    var lastAsset: PHAsset = fetchResult.lastObject as! PHAsset

    PHImageManager.defaultManager().requestImageForAsset(lastAsset, targetSize: self.UploadImagePreview.bounds.size, contentMode: PHImageContentMode.AspectFill, options: PHImageRequestOptions(), resultHandler: { (result, info) -> Void in
        self.UploadImagePreview.image = result
    })
}

@ Rodrigo:只有在提供完整的图像路径时才能正常工作。 - Alvin George

2
Ray Wenderlich有一个很棒的教程,用于使用UIImagePickerController选择图像,然后使用AssetsLibrary保存到相册。
还有关于使用图像过滤器的信息,这比教程要求的更多。

我所知道的不遵循UIImagePickerControllerDelegate的唯一方法是不遵循UINavigationControllerDelegate。UIPicker需要一个导航控制器。 - Steve Rosenberg

2

一旦您获取了UIImage对象,您可以使用以下代码将图像保存在doc目录中

let imageData = NSData(data:UIImagePNGRepresentation(wineImage.image))
let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
var docs: String = paths[0] as! String
let fullPath = docs.stringByAppendingPathComponent("yourNameImg.png")
let result = imageData.writeToFile(fullPath, atomically: true)

0
你应该像Brian提到的那样,绝对要使用UIImagePickerController,一旦你选择了图片,就可以使用这种文件管理器的方法。我不建议使用NSUserDefaults来存储图片,因为这违反了Apple的指南
let imageData = UIImagePNGRepresentation(selectedImage)
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
let imagePath = paths.stringByAppendingPathComponent("cached.png")

if !imageData.writeToFile(imagePath, atomically: false)
{
    println("not saved")
} else {
    println("saved")
    NSUserDefaults.standardUserDefaults().setObject(imagePath, forKey: "imagePath")
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接