0

我在应用程序中使用我的 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;
 }
4

3 回答 3

0

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

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

于 2013-02-11T14:39:57.287 回答
0

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

NSKeyedArchiver 是 NSCoder 的一个具体子类,它提供了一种将对象(和标量值)编码为可以存储在文件中的与体系结构无关的格式的方法。当您归档一组对象时,每个对象的类信息和实例变量都会写入归档。NSKeyedArchiver 的伴生类 NSKeyedUnarchiver 解码存档中的数据并创建一组与原始集合等效的对象。

键控存档与非键控存档的不同之处在于,编码到存档中的所有对象和值都是给定的名称或键。在解码非键控档案时,必须以与编码相同的顺序对值进行解码。在对键控存档进行解码时,由于值是按名称请求的,因此值可能被解码为乱序或根本不解码。因此,键控档案为向前和向后兼容性提供了更好的支持。

赋予编码值的键必须仅在当前正在编码的对象范围内是唯一的。带键存档是分层的,因此对象 A 用于对其实例变量进行编码的键与对象 B 使用的键不冲突,即使 A 和 B 是同一类的实例。然而,在单个对象中,子类使用的键可能与其超类中使用的键发生冲突。

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

于 2013-02-11T14:25:18.470 回答
0

你问它是否应该恢复到原来的大小?如果是这样,是的,它应该。NSKeyedArchiver 用于将对象仅转换为数据,因此更容易将它们保存在核心数据或其他存储方法中。它不是一种压缩形式。

编辑:您使用的缩放比例也不是一种压缩形式,它只是缩小可见图像,所有图像数据仍然存在。

于 2013-02-11T14:24:26.137 回答