簡體   English   中英

來自NSInputStream的UIImage

[英]UIImage from NSInputStream

我正在從Parse下載2400x1600圖像,我不希望它同時將所有數據保存在內存中。 來自Parse的PFFile對象有一個方便的方法來獲取NSData作為NSInputStream,所以當最終下載數據時,我最終得到一個NSInputStream。 所以現在我想用NSInputStream來獲取我的UIImage。 它應該像創建具有文件方法內容的UIImage一樣工作,即不是整個圖像一次加載到內存中。 我認為從NSInputStream寫入文件然后使用UIImage的文件方法的內容應該在我的情況下正常工作,但我發現無法從NSInputStream寫入文件。

任何代碼示例或一些指南都將非常感激。

提前致謝。

要完成此操作,您可以設置NSOutputStream ,然后將接收的數據流式傳輸到文件。 使用initToFileAtPath:append:創建輸出流initToFileAtPath:append:使用YES進行追加。 在輸入流回調中,通過調用write:maxLength:將數據傳遞給輸出流write:maxLength: 在文檔中閱讀更多內容 )。 一旦流完成,您就可以將完整的映像存檔,而無需將其完全存儲在內存中。

由於你正在使用Parse,因此Henri的上述答案更合適,但這是一般解決方案。

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應該用於INPUTTING數據,而不是從某個地方獲取數據
  2. NSInputStream用於流式傳輸,因此對於您希望對數據進行處理的場景,從您的描述中看起來好像您只有在完成下載后才關注數據。

簡而言之,您應該使用上述方法,除非您真正關心數據的加載方式,例如想要在它進入時操縱它(在您描述的情況下極不可能)。

至於把它全部放在內存中,你提供的尺寸不是很大,是的,你可以將它流式傳輸到一個文件中,但假設你想在應用程序中顯示它的全尺寸,內存的問題會出現在某些盡管如此,即你只是推遲不可避免的事情。 如果不是這種情況(不顯示全尺寸),那么將源圖像切割成瓷磚並使用它們可能是個好主意,可以更快地下載特定的瓷磚並更容易記憶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM