这让我疯了几个月:我有一个小应用程序来预览相机原始图像。由于有问题的文件可能很大并存储在慢速网络驱动器上,我想让用户有机会停止加载图像。
我轻松找到了这个帖子:
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:
呈现给了班级一样,这是不合理的吗?
答案 0 :(得分:0)
这是一个错误 - 当我做DTS时确认了。显然我需要提交错误报告。目前唯一的方法是使用NSURL方法。我不应该检查文件扩展名,而应该遍历元词典并检查制造商的“尼康”条目,但是...