我正在使用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。
我想下载放在S3存储桶上的图像,配置存储桶并可以下载。我将字符串视为响应中的数据。
但我无法将返回的StreamReader转换为S3示例GetObject()函数中的UnityEngine.UI.Image.sprite或UnityEngine.UI.RawImage.texture。
.replace(/(\r\n|\n|\r)/gm, " ")
有关此问题的帮助:)
S3存储桶上的图像采用PNG格式。但是在未来的JPG中,必须启用JPEG格式支持。
答案 0 :(得分: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);
}
});
}