【问题标题】:UIImage from NSInputStream来自 NSInputStream 的 UIImage
【发布时间】:2014-01-13 18:44:32
【问题描述】:

我正在从 Parse 下载 2400x1600 图像,我不希望它一次将所有数据保存在内存中。 Parse 的 PFFile 对象有一个方便的方法来获取 NSData 作为 NSInputStream,所以当最终下载数据时,我最终得到一个 NSInputStream。 所以现在我想使用那个 NSInputStream 来获取我的 UIImage。它应该像使用文件方法的内容创建 UIImage 一样工作,即不是整个图像一次加载到内存中。 我认为从 NSInputStream 写入文件然后使用 UIImage 的文件内容方法在我的情况下应该可以正常工作,但我发现无法从 NSInputStream 写入文件。

非常感谢任何代码示例或一些指南。

提前致谢。

【问题讨论】:

  • 当你显示它时,整个图像当然会在内存中。显示大小可能约为 15MB,是下载大小的许多倍。

标签: ios objective-c parsing uiimage nsinputstream


【解决方案1】:

为此,您可以设置NSOutputStream,然后将接收到的数据流式传输到文件中。使用 initToFileAtPath:append: 创建您的输出流,并使用 YES 进行追加。在您的输入流回调中,通过调用write:maxLength: (read more in the docs) 将数据传递到您的输出流。流完成后,您就可以将完整的图像保存在文件中,而无需将其完全存储在内存中。

Henri 上面的回答更合适,因为您使用的是 Parse,但这是一般解决方案。

【讨论】:

    【解决方案2】:

    documentation on iOS/OS X 中,Parse 举了一个例子。

    取回图像涉及调用 PFFile 上的 getData 变体之一。这里我们从另一个名为 anotherPhoto 的 UserPhoto 中检索图像文件:

    PFFile *userImageFile = anotherPhoto[@"imageFile"];
    [userImageFile getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) {
        if (!error) {
            UIImage *image = [UIImage imageWithData:imageData];
        }
    }];
    

    现在,我不太明白你使用 NSInputStream 的原因,主要有两个原因:

    1. NSInputStream 应该是用于输入数据,而不是从某个地方获取数据
    2. NSInputStream 用于流式传输,因此对于您想要对传入的数据执行某些操作的场景,根据您的描述,您似乎只在数据完成下载后才关心它。

    简而言之,您应该使用上述方式,除非您真正关心数据的加载方式,例如想要在数据进入时对其进行操作(在您描述的情况下不太可能)。

    至于一次将其全部存储在内存中,您提供的尺寸并没有那么大,是的,您可以将其流式传输到一个文件中,但假设您想在应用程序中以全尺寸显示它,内存问题会尽管如此,还是会在某个时候出现,即您只会推迟不可避免的事情。如果不是这种情况(不显示全尺寸),那么最好将源图像切成小块并使用它们,这样可以更快地下载特定的图块并且更容易占用内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多