2017-02-15 11 views
1

AWS Unity(v3.3.50.0):S3 SDK(AWSSDK.S3.3.3.5.4.unitypackage)をhttps://aws.amazon.com/mobile/sdk/からダウンロードしました。 My Unityバージョンは5.5.1です。ストリーム/ストリームリーダーから画像またはRawImageコンポーネントに画像をロード

S3バケットに配置されたイメージをダウンロードしたい場合は、バケットを設定してダウンロードできます。私はその文字列をデータとして応答しています。

しかし、S3サンプルのGetObject()関数で返されたStreamReaderをUnityEngine.UI.Image.spriteまたはUnityEngine.UI.RawImage.textureに変換することができません。

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); 
     }); 
} 

このについて必要なヘルプ:) S3バケットに

画像はPNG形式です。しかし、将来のJPGでは、JPEG形式のサポートが有効になっている必要があります。

+0

サーバー上の画像の形式はどのようなものですか? – Programmer

+0

ストリームからのデータ出力例を表示できますか?たぶんそれは 'base64'にあるのでしょうか、それとも代わりに' BinaryReader'を使って読むべき生のバイナリデータですか? –

+0

出力は: PNG – eagle

答えて

3

StreamReaderは、ダウンロードするイメージのようなバイナリデータではなく、テキストとして使用されます。私はあなたがなぜそれを使用しているのかを知ることができ、画像上でDebug.Log("GetObject: " + data);を実行する理由を知ることもできません。

イメージをダウンロードしてTexture2D.LoadImageを使用してTexture2Dに変換すると、RawImageにロードして表示することができます。 StreamReaderを使用して

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; 
} 

私は上記のように

は、バイナリデータのために良いではありません。あなたはそれを行うためにちょうど 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 []に​​変換します。 ストリームをbyte []に​​直接変換する方法はありませんか? – eagle

+1

Nope。あなたはストリームのサイズを知らないので、それが唯一の方法です。これを行う別の方法は、Amazonサービスを使用しないことです。最初にバイト数を送信し、次にバイト数を送信するTCPプロトコルで独自のサービスを開発します。この場合、バイト量を知っていて、メモリを1回割り当ててイメージをダウンロードします。 – Programmer

+1

大丈夫、ありがとう:) – eagle

関連する問題