在OSX中显示全尺寸相机原始文件

时间:2012-11-28 11:46:57

标签: macos nsdata nsimage cgimage

这让我疯了几个月:我有一个小应用程序来预览相机原始图像。由于有问题的文件可能很大并存储在慢速网络驱动器上,我想让用户有机会停止加载图像。

我轻松找到了这个帖子:

Cancel NSData initWithContentsOfURL in NSOperation

我正在使用Nick非常方便的方法来缓存数据,并能够在中途发出取消请求。

无论如何,一旦我有了我使用的数据:

NSImage *sourceImage = [[NSImage alloc]initWithData:data];

查看尼康.NEF文件时出现问题; sourceImage仅返回缩略图,而不是完整尺寸。显示Canon .CR2文件,事实上,任何其他.TIFF和.JPEG似乎都很好,sourceImage是预期的大小。我已经检查了正在加载的数据量(使用NSLog[data length]),似乎所有尼康文件的12mb都在-initWithData:

如果我使用

NSImage *sourceImage = [[NSImage alloc]initWithContentsOfURL:myNEFURL];

然后我得到了尼康文件的全尺寸图像,当然还有应用程序块。

因此,在我开始感觉像是我的整个生命之后,我想我知道这个问题与尼康的元数据有关,说明文件的DPI是300而佳能等人是72。

我希望解决方案是懒惰地访问该文件:

NSImage*tempImg = [[NSImage alloc] initByReferencingURL:myNEFURL];

并且在这里和其他地方看到了类似的帖子,我发现了一个简单的

的常见答案
[sourceImage setSize:tempImg.size];

但当然这只会将小缩略图的大小调整为3000x2000左右。

我一直在搞乱以下内容,希望他们能提供一种方法来从.NEF获得全局:

CGImageSourceRef isr = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);
CGImageRef isrRef = CGImageSourceCreateImageAtIndex(isr, 0, NULL);

NSBitmapImageRep *bitMapIR = [[NSBitmapImageRep alloc] initWithData:data];

但检查这些尺寸会显示类似的缩略图宽度和高度。事实上,isrRef会返回一个更小的缩略图,缩小4.2倍。也许值得注意的是300/72 == 4.2,所以isrRef考虑了已经观察到DPI(可能)的图像上的DPI。

请!有人[很好]能让我摆脱困境并帮助我从加载的数据中获取全尺寸图像吗?!?!目前,我是特殊情况下的NEF文件,在文件扩展名上使用不区分大小写的搜索,然后使用阻止方法加载URL。我必须对应用程序阻止进行点击,从长远来看,搜索不可能是万无一失的。

暂且不说:这实际上是操作系统中的错误吗?看起来NSImage's -initWithData:-initWithContentsOfURL:方法似乎使用不同的引擎来实际渲染图像。假设-initWithURL:只是加载数据然后被渲染,就好像它已经被-initWithData:呈现给了班级一样,这是不合理的吗?

1 个答案:

答案 0 :(得分:0)

这是一个错误 - 当我做DTS时确认了。显然我需要提交错误报告。目前唯一的方法是使用NSURL方法。我不应该检查文件扩展名,而应该遍历元词典并检查制造商的“尼康”条目,但是...