我正在开发一个处理超大图像(500 MB到+ 1.0 GB)的OSX应用程序。我的应用程序需要加载图像(.psd& .tif)并允许用户对图像进行排序,对图像进行评级等。
我想加载图片的小缩略图。所以我正在努力解决这个问题:
我尝试以三种不同的方式生成缩略图,最快的是生成每个缩略图大约17秒。
我正在寻找有关如何减少缩略图生成时间的建议。你们知道我可以用的图书馆吗?也许是另一种加快速度的方法。
尝试:
我使用CGImage的缩略图生成方法CGImageSourceCreateThumbnailAtIndex
来生成图像。
我使用在我的Cocoa中嵌入AppleScript并使用以下命令do shell script (\"/usr/bin/qlmanage -t -s640 \" & quoted form of file_Path & space & \" -o \" & quoted form of save_path
我使用QLThumbnailImageCreate
1& 2每个图像的时间约为17秒。 3返回空白图像。我认为这与预览需要加载它的事实有关。
我也尝试过使用GCD(Grand Central调度)来加快速度,但似乎由于磁盘读取瓶颈,进程始终是串行的,不会在并行执行。所以使用不同队列的多线程没有帮助(使用dispatch_async)。
值得一提的是,所有这些图像都存在于我的应用程序将要阅读的外部硬盘驱动器上。我们的想法是在不需要移动文件的情况下执行此操作。
我再次使用Objective-C并开发OSX 10.8。我希望可能有一个C ++ / C库或比我找到自己的三个选项更快的东西。
任何帮助都非常感激。
谢谢。
答案 0 :(得分:0)
如果文件中嵌入了预览/缩略图,您可以尝试使用映射文件创建CGImageSource(因此只能从磁盘读取生成缩略图所需的字节):
NSURL* inURL = ... // The URL for your PSD or TIFF file
// Create an NSData object that copies only the required bytes to memory:
NSDataReadingOptions dataReadingOptions = NSDataReadingMappedIfSafe;
NSData* data = [[NSData alloc] initWithContentsOfURL:inURL options:dataReadingOptions error:nil];
// Create a CGImageSourceRef that do not cache the decompressed result:
NSDictionary* sourcOptions =
@{(id)kCGImageSourceShouldCache: (id)kCFBooleanFalse,
(id)kCGImageSourceTypeIdentifierHint: (id)typeName
};
CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)data,(CFDictionaryRef)sourceOptions);
// Create a thumbnail without caching the decompressed result:
NSDictionary* thumbOptions = @{(id)kCGImageSourceShouldCache: (id)kCFBooleanFalse,
(id)kCGImageSourceCreateThumbnailWithTransform: (id)kCFBooleanTrue,
(id)kCGImageSourceCreateThumbnailFromImageIfAbsent: (id)kCFBooleanTrue,
(id)kCGImageSourceCreateThumbnailFromImageAlways: (id)kCFBooleanFalse,
(id)kCGImageSourceThumbnailMaxPixelSize:[NSNumber numberWithInteger:kIMBMaxThumbnailSize]};
result = CGImageSourceCreateThumbnailAtIndex(source,0,(CFDictionaryRef)options);
// Clean up
CFRelease(source);
[data release];
// Return the result (autoreleased):
return [NSMakeCollectable(result) autorelease];