如何在视图控制器上保存和调用 UIImage?

Posted

技术标签:

【中文标题】如何在视图控制器上保存和调用 UIImage?【英文标题】:How do i save and recall a UIImage on the View Controller? 【发布时间】:2016-10-25 10:19:01 【问题描述】:

我正在使用 Swift 3 并一直关注苹果 https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiosAppsSwift/Lesson4.html 在 20 个不同的 UIViewcontroller 上创建了 20 个不同的 UIImage 视图

它们被称为photoImageView1photoImageView2等。目前您可以点击每个通用图像并输入您自己的图像。

我希望用户能够输入他们的图像并保存它,当他们重新打开相同的viewcontroller 时,他们输入的图像就在那里。

我查看了许多不同的方法,但是我尝试关注这个问题Save images in NSUserDefaults? 并再次失败。任何帮助将不胜感激,谢谢。

【问题讨论】:

当您“输入”您拥有的图像时,您必须使用 UIImagePickerController。因此,将您选择的图像保存在 DocumentDirectory 中(确保您唯一地命名它们)并将路径存储在 ARRAY / .PLIST / 或 MODEL 中。 【参考方案1】:

我最终使用了这种方法,它可能不是最好的,但它很简单而且很有效。

import UIKit


class timetable: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate 

@IBOutlet var imageviewtimetable: UIImageView!

@IBAction func saveMyImage(_ sender: UIBarButtonItem) 

    let myTimeTableImage = imageviewtimetable.image
    let theImageData:NSData = UIImagePNGRepresentation(myTimeTableImage!)! as NSData

    UserDefaults.standard.set(theImageData, forKey: "mySavedImage")

    let data = UserDefaults.standard.object(forKey: "mySavedImage")
    imageviewtimetable.image = UIImage(data: data as! Data)








   override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view.



    let data = UserDefaults.standard.object(forKey: "mySavedImage")
    imageviewtimetable.image = UIImage(data: data as! Data)

override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.


@IBAction func selectImageFromPhotoLibrary(_ sender: Any) 

    let imagePickerController = UIImagePickerController()
    imagePickerController.sourceType = .photoLibrary
    imagePickerController.delegate = self
    present(imagePickerController, animated: true, completion: nil)






func imagePickerControllerDidCancel(_ picker: UIImagePickerController)
    dismiss(animated: true, completion:nil)



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

    let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage
    imageviewtimetable.image = selectedImage

    dismiss(animated: true,completion:nil)




/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.

*/

【讨论】:

【参考方案2】:

您可以将图像名称存储在数据库、iCloud、plist 甚至 Userdefaults 中。要将图像保存到磁盘而不是照片库,请使用:

    import PlaygroundSupport
    import UIKit

    func save(image: UIImage, name: String) -> Bool 
        guard var path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first,
            let imageData = UIImagePNGRepresentation(image) else 
                return false
        
        path = path.appendingPathComponent(name)
        do 
            try imageData.write(to: path)
         catch 
            return false
        
        return true
    

    func loadImage(name: String) -> UIImage? 
        guard var path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else 
            return nil
        
        path = path.appendingPathComponent(name)
        return UIImage(contentsOfFile: path.relativePath)
    

    let image = UIImage(named: "test.png")!
    save(image: image, name: "test2.png")
    let loadedImage = loadImage(name: "test2.png")
    PlaygroundPage.current.liveView = UIImageView(image: loadedImage)

编辑:我将源代码更改为完整的 Playground,以便您可以将其复制并粘贴到 Playground 中并运行它。您唯一需要做的就是将名为 test.png 的文件拖到 Resources 文件夹中。

【讨论】:

我是不是要改变 (let imageData = UIImagePNGRepresentation(image) else ) 图像部分?如果是的话怎么办?当我使用函数时,它会出现错误缺少参数,当我将其更改为我想象的其他内容时,我会收到错误无法在 UIImage 类型上使用 UIImageView 类型。 我想我必须用一个名字来清除它,不是吗?然后把那个名字放在那里。图像在哪里......然后在(名称)下输入名称以将其保存在文件目录下 name 是文件名。它保存在文档目录中。您可以在documents 目录下创建自己的目录,但本示例并没有这样做。代码按原样工作;我在操场上测试了它。如果您不介意有损压缩,可以将 UIImagePNGRepresentation 更改为 UIImageJPGRepresentation。 目前工作,稍后尝试将其添加到程序中,谢谢

以上是关于如何在视图控制器上保存和调用 UIImage?的主要内容,如果未能解决你的问题,请参考以下文章

使用推送视图控制器时如何将 Uiimage 从一个视图控制器传递到另一个视图控制器?

保存 UIImage 中显示的图像并对其进行分类

如何将 UIImage 视图和其中的文本保存到磁盘

如何在 uiimage 选择器控制器中更改图像大小

试图显示从一个视图控制器捕获的 UIImage,并在 iOS 中的另一个视图控制器中显示它

视图控制器调用模态视图