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

时间:2017-02-15 08:59:36

标签: c# unity3d amazon-s3 aws-sdk streamreader

我正在使用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格式支持。

1 个答案:

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