iOS & Swift - Как я могу получить и сохранить UIImage от пользователя?

Я пишу приложение Swift для iOS. Я хочу знать, как получить изображение с камеры пользователя (или как там его называют в наши дни) и сохранить его локально в приложении, чтобы я мог сослаться на него позже. Как можно поступить об этом? В качестве примера, скажем, я хочу получить изображение и установить его в качестве изображения для UIImageView в моей раскадровке.

5 ответов

Решение

Это именно то, что UIImagePickerController в сочетании с NSUserDefaults Сделаю.

Для вас это будет задача из двух частей. Сначала вам нужно будет сделать снимок с UIImagePickerController а затем либо сохранить его в своей библиотеке фотографий, либо сохранить его на своем устройстве с NSUserDefaults,

Чтобы сохранить изображение с NSUserDefaults смотри этот вопрос.

Вот моя комбинация.

Сохранение изображения:

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
    })
}

Как только вы получите объект UIImage, вы можете сохранить изображение в doc dir с помощью следующего кода

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)

Рэй Вендерлих имеет отличный учебник по использованию UIImagePickerController выбрать изображение, а затем с помощью AssetsLibrary сохранить в альбом.

Также есть информация об использовании фильтров изображений, которая больше, чем вы просили в учебнике.

Вы должны определенно использовать 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")
}
Другие вопросы по тегам