4

到目前为止,我已经设法为 iPhone 创建了一个应用程序,它可以拍摄多张图像,每张图像之间的间隔约为 3 秒。我在一个单独的线程中异步处理每个图像,一切都很好,直到将图像保存在 iPhone 磁盘上。然后使用 JPEG 表示将图像保存到磁盘大约需要 12 秒。

Apple 是如何做到的,他们是如何设法将单个图像如此快速地保存到磁盘上的?他们正在使用什么技巧?我看到动画让用户分心了一段时间,但所需的时间仍然低于 12 秒!

提前致谢。

4

4 回答 4

4

实际上,苹果使用其内核驱动程序 AppleJPEGDriver,它是一个硬件 jpeg 编码 api,比软件编码 (JPEGRepresnetaion) 和一些在越狱应用程序中使用它的人 (cycorder 视频录制应用程序) 快得多。苹果应该给它的用户同样的功能,但他们是苹果 :)

于 2010-05-11T04:05:40.973 回答
2

我还没有尝试过,但我不太确定 Apple 没有使用相同的方法。Apple 设计理念的很大一部分依赖于对用户隐藏操作中断。Apple 代码可能需要和您一样多的时间,但只是熟练地将整个保存时间隐藏在用户的感知之外。

如果有人无法告诉您 Apple 实际上如何更快地保存,我建议您寻找掩饰保存时间的方法。

于 2009-10-19T14:12:53.270 回答
0

如果你用谷歌搜索一下......有一大堆人有同样的问题。

我没有找到答案。一般的结论似乎是苹果要么使用一些内部 api 并绕过公共 api 开销,要么使用一些硬件编码器。

猜你运气不好,无法快速保存图像

于 2009-10-19T07:44:15.377 回答
0

我在我的应用程序中遇到了这个问题,保存它会挂起,所以我使用了 Grand Central 调度。

下面是我的图像缓存类中的 setImage 方法,如果 UIImage 有图像,则将其保存,否则将其删除。您可以调整它以满足您的需求,希望仅适用于 iOS 4+。该代码已启用 ARC。

-(void)setImage:(UIImage *)image{
    if (image == nil){
    NSLog(@"Deleting Image");
    // Since we have no image let's remove the cached image if it exists
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                   NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,
                   NSUserDomainMask, YES) objectAtIndex:0];
                   [[NSFileManager defaultManager] removeItemAtPath:[cachePath
                   stringByAppendingPathComponent:@"capturedimage.jpg"] error:nil];
                 });
    }
else {
      NSLog(@"Saving Image");
      // We've got an image, let's save it to flash memory.
      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                     NSString *cachePath = 
                    [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,
                    NSUserDomainMask, YES) objectAtIndex:0];
                    NSData *dataObj = UIImagePNGRepresentation(image);
                    [dataObj writeToFile:[cachePath 
                    stringByAppendingPathComponent:@"capturedimage.jpg"] atomically:NO];
                  });
     }

imageCache = image;

}
于 2012-05-19T23:42:15.987 回答