在DocumentDirectory iOS和UICollectionView中访问图像

时间:2016-12-09 15:01:26

标签: ios swift image uicollectionview nsdocumentdirectory

在我的应用中,用户从相机胶卷中选择一张图像,并将其保存在文档目录中。然后,图像将显示在ViewController上,用于选择图像。我希望将图像附加到UICollectionView。如何从documentDirectory访问图像/追加图像?请参阅下面的代码。如果您需要我项目的其他部分,请告诉我。

DetailViewController(我最初显示照片的位置):

<?php
// src/Acme/SecurityBundle/Controller/SecurityController.php

namespace Acme\SecurityBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Security\Core\Security;

class SecurityController extends Controller
{
    public function loginAction()
    {
        $request = $this->getRequest();
        $session = $request->getSession();

        // get the login error if there is one
        if ($request->attributes->has(Security::AUTHENTICATION_ERROR)) {
            $error = $request->attributes->get(Security::AUTHENTICATION_ERROR);
        } else {
            $error = $session->get(Security::AUTHENTICATION_ERROR);
            $session->remove(Security::AUTHENTICATION_ERROR);
        }

        // Add the following lines
        if ($session->has('_security.target_path')) {
            if (false !== strpos($session->get('_security.target_path'), $this->generateUrl('fos_oauth_server_authorize'))) {
                $session->set('_fos_oauth_server.ensure_logout', true);
            }
        }

        return $this->render('AcmeSecurityBundle:Security:login.html.twig', array(
            // last username entered by the user
            'last_username' => $session->get(Security::LAST_USERNAME),
            'error'         => $error,
        ));
    }
}

ImageStore(我最初如何存储照片):

class DetailViewController: UIViewController, UITextFieldDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

...

var imageStore: ImageStore!

@IBAction func takePicture(sender: UIBarButtonItem) {

    let imagePicker = UIImagePickerController()

    if UIImagePickerController.isSourceTypeAvailable(.Camera) {
        imagePicker.sourceType = .Camera
    } else {
        imagePicker.sourceType = .PhotoLibrary
    }
    imagePicker.delegate = self

    presentViewController(imagePicker, animated: true, completion: nil)
}

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: AnyObject]) {

    let image = info[UIImagePickerControllerOriginalImage] as! UIImage

    imageStore.setImage(image, forKey: item.itemKey)

    imageView.image = image

    dismissViewControllerAnimated(true, completion: nil)
}

override func viewWillAppear(animated: Bool) {

super.viewWillAppear(animated)

let key = item.itemKey

if let imageToDisplay = imageStore.imageForKey(key) {
   imageView.image = imageToDisplay
   }
}

UICollectionView:

import UIKit

class ImageStore: NSObject {

let cache = NSCache()

func setImage(image: UIImage, forKey key: String) {
    cache.setObject(image, forKey: key)

    let imageURL = imageURLForKey(key)

    if let data = UIImageJPEGRepresentation(image, 0.5) {
        data.writeToURL(imageURL, atomically: true)
    }
}
func imageForKey(key: String) -> UIImage? {
    if let existingImage = cache.objectForKey(key) as? UIImage {
        return existingImage
    }

    let imageURL = imageURLForKey(key)
    guard let imageFromDisk = UIImage(contentsOfFile: imageURL.path!) else {
        return nil
    }

    cache.setObject(imageFromDisk, forKey: key)
    return imageFromDisk
}

func deleteImageForKey(key: String) {
    cache.removeObjectForKey(key)

    let imageURL = imageURLForKey(key)
    do {
        try NSFileManager.defaultManager().removeItemAtURL(imageURL)
    }
    catch let deleteError {
        print("Error removing the image from disk: \(deleteError)")
    }
}

func imageURLForKey(key: String) -> NSURL {
    let documentsDirectories =
    NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
    let documentDirectory = documentsDirectories.first!

    return documentDirectory.URLByAppendingPathComponent(key)
  }

}

1 个答案:

答案 0 :(得分:0)

您可以尝试以这种方式保存并获取图像:

//Save image
let img = UIImage() // Image from your picker
let data = UIImagePNGRepresentation(img)!
do {
    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
    try data.writeToFile("\(documentsPath)myImage", options: [])

} catch {
    print("Error")
}

// Get image
do {
    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
    let readData = try NSData(contentsOfFile: "\(documentsPath)myImage", options: [])
    let retreivedImage = UIImage(data: readData)
}
catch {
    print("Error")
}

https://stackoverflow.com/a/35685943/2894160

相同