首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将图像从流/流阅读器加载到图像或RawImage组件

将图像从流/流阅读器加载到图像或RawImage组件
EN

Stack Overflow用户
提问于 2017-02-15 08:59:36
回答 1查看 9K关注 0票数 3

我使用AWS (v3.3.50.0):S3 SDK (AWSSDK-S3.3.3.5.4.unitypackage)从https://aws.amazon.com/mobile/sdk/下载。我的统一版本是5.5.1。

我想下载一个放在S3桶上的映像,存储桶是配置好的,可以下载。我将字符串视为响应的数据。

但我无法将返回的StreamReader转换为S3示例GetObject()函数中的UnityEngine.UI.Image.sprite或UnityEngine.UI.RawImage.texture。

代码语言:javascript
复制
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格式支持必须启用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-15 10:42:34

StreamReader用于文本,而不是像要下载的图像那样的二进制数据。我可以告诉您为什么要使用它,也不能告诉您为什么要在图像上执行Debug.Log("GetObject: " + data);

下载图像,然后使用Texture2D.LoadImage将其转换为Texture2D,然后将其加载到RawImage中以显示。

代码语言:javascript
复制
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函数应该如下所示:

代码语言:javascript
复制
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);
        }
    });
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42244755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档