使用NSKeyedArchiver存档时,UIImage不会减小文件大小

时间:2013-02-11 14:15:22

标签: iphone ios

我在app中使用iphone库中的图像。以下方法效果很好但我的问题是当我使用NSData归档图像时。稍后在UIImage尺寸上取消存档图像时会恢复原始尺寸?

NSData *data = [[NSData alloc]init];
UIImage *reducedImage = [self imageWithImage:selectedImage      scaledToSize:CGSizeMake(50,50)];
data = [NSKeyedArchiver archivedDataWithRootObject:reducedImage];

这里使用的方法是

 - (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
UIGraphicsBeginImageContext(newSize);
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
 }

3 个答案:

答案 0 :(得分:0)

您是否要求恢复到原始尺寸?如果是的话,是的。 NSKeyedArchiver用于将对象转换为数据,因此更容易将它们保存在核心数据或其他存储方法中。它不是一种压缩形式。

编辑:您使用的尺寸也不是压缩形式,只是缩小了可见图像,所有图像数据仍然存在。

答案 1 :(得分:0)

这并不意味着制作像zip文件一样的压缩文件,这意味着将所有相关数据放在一起,然后将其保存到单个文件中。

   NSKey的一个具体子类NSKeyedArchiver提供了一种方法   将对象(和标量值)编码为独立于体系结构   可以存储在文件中的格式。归档一组时   对象,每个对象的类信息和实例变量   被写入档案。 NSKeyedArchiver的伴侣班,   NSKeyedUnarchiver,解码存档中的数据并创建一组   等同于原始集合的对象。

     

密钥存档与非密钥存档的区别在于所有   编码到存档中的对象和值被赋予名称或键。   解码非键控存档时,必须在中解码值   它们被编码的顺序相同。解码密钥存档时,   因为值是按名称请求的,所以可以解析值   顺序或根本没有。因此,密钥档案提供了更好的服务   支持向前和向后兼容。

     

给定编码值的键必须仅在范围内是唯一的   正在编码的当前对象键控存档是分层的,   所以对象A用来编码其实例变量的键不会   与对象B使用的键冲突,即使A和B是实例   同一类。但是,在单个对象中,a使用的键   子类可能与其超类中使用的键冲突。

     

NSArchiver对象可以将存档数据写入文件或文件   您提供的mutable-data对象(NSMutableData的一个实例)。

答案 2 :(得分:0)

UIImage drawInRect只是将附加到UIImage的位图图像放入你给它的区域。 数据本身没有改变......

您正在寻找的是压缩。请参阅UIKit UIImagePNGRepresentationUIImageJPEGRepresentation函数。