2017-02-15 38 views
1

Я использую AWS Unity (v3.3.50.0): S3 SDK (AWSSDK.S3.3.3.5.4.unitypackage), загруженный с https://aws.amazon.com/mobile/sdk/. Версия моего единства - 5.5.1.Загрузить изображение из Stream/StreamReader в компонент Image или RawImage

Я хочу загрузить изображение, размещенное на ведре S3, bucket настроен и может быть загружен. И я вижу строку в качестве данных в ответ.

Но я не могу преобразовать возвращенный StreamReader в UnityEngine.UI.Image.sprite ИЛИ UnityEngine.UI.RawImage.texture в S3 sample GetObject().

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 для отображения.

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

хорошая работа. это сработало! благодаря! :) есть ли какой-либо способ оптимизации производительности? как в этом, сначала вы его читаете, затем записываете в буфер, а затем конвертируете в байт []. Не существует способа конвертировать поток непосредственно в байт []? – eagle

+1

Nope. Вы не знаете размер потока, так что это единственный способ. Другой способ сделать это - не использовать службу Amazon. Разработайте собственный сервис с протоколом TCP, который сначала отправит количество байтов, а затем байты. В этом случае вы знаете сумму байта и выделите память один раз, чтобы загрузить изображение. – Programmer

+1

ладно, спасибо :) – eagle