保存和读取图像数组

Posted

技术标签:

【中文标题】保存和读取图像数组【英文标题】:Saving and Reading Image Array 【发布时间】:2016-07-01 21:02:18 【问题描述】:

我想将我的图像数组“DtaAryVar”保存在“NSUserDefaults”或“文档目录”或“核心数据”中。谁能一步一步告诉我什么是最好和最简单的方法来存储它以及“UIImage”数组(包含20个图像)到“NSData”转换。我的“DtaAryVar”包含 20 张图像。我尝试了以下从堆栈溢出中找到但出现错误的方法。请帮帮我。

var DtaAryVar: [NSData]()
 convert array of NSData to Data and store

let DtaZipVar = NSKeyedArchiver.archivedDataWithRootObject(DtaAryVar)

let DftSdbVal = NSUserDefaults.standardUserDefaults()
DftSdbVal.setObject(DtaZipVar, forKey: "ImageKey")

get back data by

var DtaZipVar = DftSdbVal.valueForKey("ImageKey")
var DtaAryVar = NSKeyedUnarchiver.unarchiveObjectWithData(DtaZipVar) as! [NSData]

let ImjAryVar = [UIImage]()
for DtaIdxVar in DtaAryVar

    ImjAryVar.append(UIImage(data : DtaIdxVar))

错误 无法转换“AnyObject”类型的值?到预期的参数类型'NSData。

【问题讨论】:

【参考方案1】:

|=> U 只能在 userDefautls 或 coreData 中存储 NSData 而不是 [NSData]

|=> 如果你存储在核心数据中,将属性类型指定为二进制

|*|将原始数据中的行添加到 CoreData:

let NewRowDtaVar = NSEntityDescription.insertNewObjectForEntityForName("NamTbl", inManagedObjectContext: ContxtVar)
NewRowDtaVar.setValue(ImgDtaVar, forKey: "NamKol")
AppDgtVar.saveContext()

|*|从 CoreData 获取行数据:

let GetDtaAryReqVar = NSFetchRequest(entityName: "NamTbl")
GetDtaAryReqVar.returnsObjectsAsFaults = false
GetDtaAryReqVar.predicate = NSPredicate(format: "NamKol = TstTxt")

let ImgDtaVar = NSData()
do

    let ReqResAryVar: Array  = try ContxtVar.executeFetchRequest(GetDtaAryReqVar)
    
    if(ReqResAryVar.count > 0)
    
        for ReqResVar in ReqResAryVar
        
            ImgDtaVar = ReqResVar.valueForKey("NamKol") as! NSData!
        
    

catch let ErrVar as NSError

    print("Fetch failed: \(ErrVar.localizedDescription)")


在您的任何 viewController 类之外添加以下扩展函数并相应地尝试

extension UIImage


//|*| Convert Image NSData Arry to UIImage Array

    func CnvDtaAryTooImjAryFnc(ImjDtaAryPsgVar: [NSData])-> [UIImage]
    
        var ImjAryVar = [UIImage]()
        for DtaIdxVar in ImjDtaAryPsgVar
        
            ImjAryVar.append(UIImage(data : DtaIdxVar)!)
        
        return ImjAryVar
    

//|*| Convert Image NSData to UIImage Array

    func CnvDtaTooImjAryFnc(ImjDtaPsgVar: NSData)-> [UIImage]
    
        let ImjAryVar = NSKeyedUnarchiver.unarchiveObjectWithData(ImjDtaPsgVar) as! [NSData]
        return CnvDtaAryTooImjAryFnc(ImjAryVar)
    

//|*| Convert UIImage Array to Image NSData Arry  

    func CnvImjAryTooDtaAryFnc(ImjDtaPsgVar: [UIImage], ImjTyp ImjTypPsgVar: String?="Jpg")-> [NSData]
    
        var ImjDtaAryVar = [NSData]()
        for DtaIdxVar in ImjDtaPsgVar
        
            if(ImjTypPsgVar == "Png")
            
                if let GetImjDtaVar = UIImagePNGRepresentation(DtaIdxVar)
                
                    ImjDtaAryVar.append(GetImjDtaVar)
                
            
            else
            
                if let GetImjDtaVar = UIImageJPEGRepresentation(DtaIdxVar, 1)
                
                    ImjDtaAryVar.append(GetImjDtaVar)
                
            
        
        return ImjDtaAryVar
    

//|*| Convert UIImage Array to Image NSData 

    func CnvImjAryTooDtaFnc(ImjDtaPsgVar: [UIImage], ImjTyp ImjTypPsgVar: String?="Jpg")-> NSData
    
        let ImjDtaAryVar = CnvImjAryTooDtaAryFnc(ImjDtaPsgVar, ImjTyp : ImjTypPsgVar)
        return NSKeyedArchiver.archivedDataWithRootObject(ImjDtaAryVar)
    

【讨论】:

以上是关于保存和读取图像数组的主要内容,如果未能解决你的问题,请参考以下文章

python读取图像的几种方式

如何正确保存和读取图像?

如何将图像保存和读取为文本,嵌入在代码中

scipy

markdown 使用PIL(枕头)模块读取和保存图像

读取 JPG 文件,直到出现某些字节