【问题标题】:Create thumbnail for large .psd and .tiff files in cocoa (objective-c)为可可中的大型 .psd 和 .tiff 文件创建缩略图(objective-c)
【发布时间】:2013-05-06 17:44:10
【问题描述】:

我正在开发一个处理超大图像(500 MB 到 + 1.0 GB)的 OSX 应用程序。我的应用程序需要加载图像(.psd 和 .tif)并允许用户对图像进行排序、对图像进行评分等。

我想加载图片的小缩略图。所以这就是我正在努力解决的问题:

我尝试过以三种不同的方式生成缩略图,最快的生成每个缩略图大约需要 17 秒。

我正在寻找有关如何减少缩略图生成时间的建议。你们知道我可以使用的图书馆吗?也许是另一种加快速度的方法。

尝试:

  1. 我使用了CGImage的缩略图生成方法CGImageSourceCreateThumbnailAtIndex来生成图片。

  2. 我在我的 Cocoa 中使用了嵌入 AppleScript 并使用了以下命令 do shell script (\"/usr/bin/qlmanage -t -s640 \" & quoted form of file_Path & space & \" -o \" & quoted form of save_path

  3. 我使用QLThumbnailImageCreate从图像预览中抓取缩略图

1 和 2 每个图像的第二代时间都在 17 左右。 3 返回空白图像。我认为这与预览需要加载它有关。

我也尝试过使用 GCD(Grand Central 调度)来加快速度,但似乎由于磁盘读取瓶颈,进程始终是串行的,不会并行执行。所以使用不同队列的多线程没有帮助(使用 dispatch_async)。

值得一提的是,所有这些图像都存在于我的应用程序将读取的外部硬盘驱动器上。这样做的目的是无需移动文件。

我再次使用 Objective-C 并开发 OSX 10.8。我希望也许有一个 C++/C 库或比我自己找到的三个选项更快的东西。

任何帮助都非常感谢。

谢谢。

【问题讨论】:

  • 从本地磁盘加载时是否得到相同的计时。我问,因为它可能不是您使用哪种方法加载,而是您从哪里加载。我有一个商业应用程序加载数千张图像的大缩略图的问题。但是,如果我从共享点加载它们,那么 1500 张图像可能需要 20 分钟。首先将文件复制到我的本地驱动器(几分钟),然后可能需要大约 40 秒来构建所有拇指。

标签: objective-c applescript thumbnails tiff psd


【解决方案1】:

如果文件中嵌入了预览/缩略图,您可以尝试使用映射文件创建 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];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2010-11-23
    • 2012-08-11
    • 2013-08-28
    相关资源
    最近更新 更多