将图像从 Stream/StreamReader 加载到图像或 RawImage 组件

Load Image from Stream/StreamReader to Image OR RawImage component

我正在使用 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 bucket上的图片,bucket已经配置好可以下载了。我将字符串视为响应中的数据。

但我无法将返回的 StreamReader 转换为 S3 示例 GetObject() 函数中的 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格式的支持必须要开启。

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