2017-02-15 142 views
1

我正在使用AWS Unity(v3.3.50.0):從https://aws.amazon.com/mobile/sdk/下載的S3 SDK(AWSSDK.S3.3.3.5.4.unitypackage)。 我的Unity版本是5.5.1。從Stream/StreamReader將圖像加載到圖像或RawImage組件

我想下載放置在S3存儲桶上的映像,存儲桶已配置並且可以下載。我看到這個字符串是作爲響應的數據。

但我無法在S3示例GetObject()函數中將返回的StreamReader轉換爲UnityEngine.UI.Image.sprite或UnityEngine.UI.RawImage.texture。需要對此:)

的S3存儲圖像是PNG格式

private void GetObject() 
{ 
    ResultText.text = string.Format("fetching {0} from bucket {1}", SampleFileName, S3BucketName); 
    Client.GetObjectAsync(S3BucketName, SampleFileName, (responseObj) => 
     { 
      string data = null; 
      var response = responseObj.Response; 
      if (response.ResponseStream != null) 
      { 
       using (StreamReader reader = new StreamReader(response.ResponseStream)) 
       { 
        data = reader.ReadToEnd(); 
       } 

       ResultText.text += "\n"; 
       ResultText.text += data; 
      } 
      Debug.Log("GetObject: " + data); 
     }); 
} 

幫助。但在未來的JPG中,必須啓用JPEG格式支持。

+0

服務器上的圖像格式是什麼? – Programmer

+0

可以顯示流的示例數據輸出嗎?也許它在'base64'中,或者它可能只是原始的二進制數據,你應該用'BinaryReader'來讀取呢? –

+0

輸出結果是: PNG – eagle

回答

3

StreamReader用於文本而不是二進制數據,如要下載的圖像。我可以告訴你爲什麼使用它,並且不能告訴你爲什麼在圖像上執行Debug.Log("GetObject: " + data);

下載的圖像,然後使用Texture2D.LoadImage將其轉換爲的Texture2D,你就可以加載到你的RawImage顯示。

public RawImage displayTexture; 

private void GetObject() 
{ 
    ResultText.text = string.Format("fetching {0} from bucket {1}", SampleFileName, S3BucketName); 
    Client.GetObjectAsync(S3BucketName, SampleFileName, (responseObj) => 
    { 
     byte[] data = null; 
     var response = responseObj.Response; 
     if (response.ResponseStream != null) 
     { 
      using (StreamReader reader = new StreamReader(response.ResponseStream)) 
      { 
       using (var memstream = new MemoryStream()) 
       { 
        var buffer = new byte[512]; 
        var bytesRead = default(int); 
        while ((bytesRead = reader.BaseStream.Read(buffer, 0, buffer.Length)) > 0) 
         memstream.Write(buffer, 0, bytesRead); 
        data = memstream.ToArray(); 
       } 
      } 

      //Display Image 
      displayTexture.texture = bytesToTexture2D(data); 
     } 
    }); 
} 

public Texture2D bytesToTexture2D(byte[] imageBytes) 
{ 
    Texture2D tex = new Texture2D(2, 2); 
    tex.LoadImage(imageBytes); 
    return tex; 
} 

就像我上面提到的,使用StreamReader對二進制數據不好。你可以使用MemoryStream來做到這一點。在這種情況下,您的新GetObject功能應如下所示:

private void GetObject() 
{ 
    ResultText.text = string.Format("fetching {0} from bucket {1}", SampleFileName, S3BucketName); 
    Client.GetObjectAsync(S3BucketName, SampleFileName, (responseObj) => 
    { 
     byte[] data = null; 
     var response = responseObj.Response; 
     Stream input = response.ResponseStream; 

     if (response.ResponseStream != null) 
     { 
      byte[] buffer = new byte[16 * 1024]; 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       int read; 
       while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
       { 
        ms.Write(buffer, 0, read); 
       } 
       data = ms.ToArray(); 
      } 

      //Display Image 
      displayTexture.texture = bytesToTexture2D(data); 
     } 
    }); 
} 
+0

不錯的工作。有效!謝謝! :) 是否有任何性能優化方式來做到這一點?就像這樣,首先你正在讀它,然後把它寫入緩衝區,然後把它轉換爲字節[]。 沒有辦法將流直接轉換爲byte []嗎? – eagle

+1

沒有。你不知道流的大小,所以這是唯一的方法。另一種方法是不使用亞馬遜服務。用TCP協議開發你自己的服務,它將先發送字節數然後再發送字節。在這種情況下,你知道字節數量並且會分配一次內存來下載圖像。 – Programmer

+1

好的,謝謝:) – eagle

相關問題