gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:19:15 25 4
gpt4 key购买 nike

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

但我无法在 S3 示例 GetObject() 函数中将返回的 StreamReader 转换为 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);
}
});
}

关于c# - 将图像从 Stream/StreamReader 加载到图像或 RawImage 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42244755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com