使用NSImage有效地将NSDictionary写入文件

时间:2014-09-07 23:56:40

标签: objective-c xcode macos

我有一个NSMutableDicitionary包含两个NSStrings和一个NSImage,我试图写入一个文件。但是输出文件与输入图像文件(88kB到1.1MB)相比是巨大的。图像通过Image Well拖放加载。

我的第一次尝试是:

NSImage * image = _imageView.image;
[dictionary setObject:image forKey:@"Image"];
[NSKeyedArchiver archiveRootObject:dictionary toFile:filePath];

结果:1​​.1MB

第二次尝试:

NSImage * image = _imageView.image;
NSData * imageData = [image TIFFRepresentation];
NSBitmapImageRep * encodedImage = [NSBitmapImageRep imageRepWithData:imageData];
[dictionary setObject:encodedImage forKey:@"Image"];
[NSKeyedArchiver archiveRootObject:dictionary toFile:filePath];

结果:仍为1.1MB

起初我认为NSBitmapImage会将图像保持为(至少相对)压缩格式,但文件大小不会有一点差异。

我应该如何将NSMutable字典写入文件,以使其不超过初始图像文件大小?或者我应该如何在图像中有效地存储图像?

我不知道这是否重要,但原始格式是png。

1 个答案:

答案 0 :(得分:1)

当您将图像拖放到图像视图中时,它会作为位图(每个像素的颜色数据)加载到NSImage中。它不会像您放入其中的原始图像那样被压缩(在您的情况下为PNG)。 PNG使用无损压缩,其数据占用空间在大多数情况下小于图像的未压缩位图或TIFF表示。

然后,当您请求图像的TIFF表示时,它与您加载到其中的原始PNG图像无关,除了像素数据本身。

如果要以压缩格式存储图像或保留原始图像,可以尝试以下操作之一:

  1. 使用TIFFRepresentationUsingCompression:factor:请求压缩的TIFF表示。将仍然是不同的格式,您将丢失所有元数据
  2. 使用所需格式重新压缩图像,例如PNG,jpeg等(例如使用Quartz API),并将压缩格式存储在字典中。如果需要,您仍需要自己保留元数据
  3. 保持对原始图像文件的引用或存储其数据。通过覆盖ImageView的拖放方法并跟踪原始图像URL或从文件加载它并存储原始格式的原始数据。然后将其保存到您的字典中。您将获得原始图像的精确副本,而不必处理格式转换和元数据复制。