在文件中存储大量UIImage用于动画

时间:2013-04-18 03:43:23

标签: iphone ios

我正在尝试将大量的UIImage存储到文件中并读取它。我想到的选项是:

  1. 将图像转换为NSData并将每个图像保存到相应的文件(“1.png”,“2. png”等),然后再读取它们。
  2. 将图像转换为NSData并保存到一个大文件,并将每个图像的开头位置存储在文件中。然后稍后打开文件并使用NSFileHandle的seekToFileOffset读取它们。
  3. 我正在考虑选项2的原因是因为我正在尝试使用这些图像来实现动画。我不确定一次打开一张图像对于高帧率动画来说是否足够快。还有一种更好的方式我还没有意识到。我会很感激任何建议。谢谢!

6 个答案:

答案 0 :(得分:2)

其他选项可能是

  
      
  1. 您可以缓存图像并同时将其文件路径存储在plist文件中,并在必要时访问它。
  2.   

它只是另一个建议考虑它!

答案 1 :(得分:2)

iOS 5在UIImage上有一个支持一系列图像的方法。

+ (UIImage *)animatedImageNamed:(NSString *)name duration:(NSTimeInterval)duration

该方法的使用文档如下:

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIImage_Class/Reference/Reference.html

答案 2 :(得分:0)

无需过早优化它。

最简单且可能最好的解决方案是如上所述为图像设置命名约定。我实际上在帧编号的左边添加了零,所以你也可以处理更高的帧数。

即。 IMG_0001.png,IMG_0002.png等

使用第一个图像创建UIImageView并创建一个frameIndex变量,您将使用该变量跟踪当前动画帧并加载正确的图像。

然后安排NSTimer以您想要的速率运行(即1/15 == 15FPS,1/30 = 30FPS等),并在每次NSTimer调用选择器时用新的替换UIImageView上的当前图像。

这是一个简单的例子:

- (void)startAnimation
{
    self.currentFrame = 0;
    self.animationTimer = [NSTimer scheduledTimerWithTimeInterval:1/30.f
                                                           target:self
                                                         selector:@selector(_switchImage:)
                                                         userInfo:nil
                                                          repeats:YES];
}

然后使用_switchImage方法:

- (void)_switchImage:(NSTimer*)timer
{
    NSString *filename = [NSString stringWithFormat:@"IMG_%04i", self.currentFrame];
    NSString *fullPath = [[NSBundle mainBundle] pathForResource:filename ofType:@"png"];
    @autoreleasepool {
        UIImage *image = [UIImage imageWithContentsOfFile:fullPath];
        if (image) {
            self.animationImageView.image = image;
            self.currentFrame = self.currentFrame + 1;
            // If for any reason we reach the last animation frame, loop back to the beginning of the animation
            if (self.currentFrame > kLastAnimationFrame)
                self.currentFrame = 0;
        }
    }
}

答案 3 :(得分:0)

有趣。听起来你需要调查一些解决方案...我认为这完全取决于图像的数量,它们的大小,你希望它们出现的帧速率等等。

从最简单的解决方案开始,逐步完成,直到找到合适的解决方案。

切入另一个解决方案(不是最简单的)。一体化文件的变体。您可以使用绕过文件读取的[NSData dataWithContentsOfMappedFile:](通过缓冲区传递内容)并提供对字节的直接内存访问。

请注意,此方法已在iOS5中弃用,建议使用dataWithContentsOfFile:作为替代方案,也可选择NSDataReadingMappedAlways选项,因为它的更大兄弟似乎是使用什么

内存映射文件可以提供有趣的功能。我使用qsort()mmap()编写文件排序后 http://www.memention.com/blog/2011/05/04/That-old-thing.html

答案 4 :(得分:0)

你没有提到你想做动画的原因。所以在黑暗中拍摄,您是否考虑过将Cocos 2D用于动画?这里有一个很棒的教程:

http://www.raywenderlich.com/32045/how-to-use-animations-and-sprite-sheets-in-cocos2d-2-x

答案 5 :(得分:-1)

另一种选择是: 1.创建数据库文件并将所有图像加载到其中。 2.在安装时将数据库文件从assets文件夹复制到文档文件夹(如果使用phonegap / jquery,如果不是,我假设还有其他方法可以执行此操作)。 3.现在您可以在需要时使用图像,因为(只是猜测)数据库访问比文件访问更快。