c# - 使用 HttpWebRequest 下载后 PNG 文件显示为红色问号

标签 c# rest unity-game-engine

我面临以下问题:我从谷歌驱动器下载一个 png 文件,所有字节都已成功接收(看起来),但是当我尝试构建 Texture2D 时并将其设置为 SpriteImage ,只出现红色问号。

我错过了什么吗?

代码如下:

HttpWebRequest request = (HttpWebRequest) WebRequest.Create("https://content.googleapis.com/drive/v3/files/" + fileId + "?alt=media");
request.Method = "GET";
request.ContentType = "image/png";
request.Headers.Add("Authorization", "Bearer " + AUTH_TOKEN);

WebResponse response = request.GetResponse();
byte[] bytes = new byte[response.ContentLength];
response.GetResponseStream().Read(bytes, 0, (int) response.ContentLength);
response.Close();

Texture2D texture2d = new Texture2D(8, 8);
Sprite sprite = null;
if (texture2d.LoadImage(bytes)) {
    sprite = Sprite.Create(texture2d, new Rect(0, 0, texture2d.width, texture2d.height), Vector2.zero);
}
if (sprite != null) {
    imageToUpdate.sprite = sprite;
}

最佳答案

我用你的确切代码做了一个快速测试,这个 image然后去这个:

问题是您没有下载所有图像字节。这不是使用 HttpWebRequest 下载所有图像字节的方法。在 while 循环中使用 MemoryStreamStream.Read。如果没有其他内容可读取,Stream.Read 将返回 0

查看 downloadFullData 函数,了解如何正确执行此操作:

public Image imageToUpdate;

void Start()
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://wallpaper-gallery.net/images/hq-images-wallpapers/hq-images-wallpapers-12.jpg");
    request.Method = "GET";
    //request.ContentType = "image/png";
    //request.Headers.Add("Authorization", "Bearer " + AUTH_TOKEN);

    WebResponse response = request.GetResponse();

    if (response == null)
    {
        return;
    }

    //Download All the bytes
    byte[] bytes = downloadFullData(request);

    //Load Image
    Texture2D texture2d = new Texture2D(8, 8);
    Sprite sprite = null;
    if (texture2d.LoadImage(bytes))
    {
        sprite = Sprite.Create(texture2d, new Rect(0, 0, texture2d.width, texture2d.height), Vector2.zero);
    }
    if (sprite != null)
    {
        imageToUpdate.sprite = sprite;
    }
}

byte[] downloadFullData(HttpWebRequest request)
{
    using (WebResponse response = request.GetResponse())
    {

        if (response == null)
        {
            return null;
        }

        using (Stream input = response.GetResponseStream())
        {
            byte[] buffer = new byte[16 * 1024];
            using (MemoryStream ms = new MemoryStream())
            {
                int read;
                while (input.CanRead && (read = input.Read(buffer, 0, buffer.Length)) > 0)
                {
                    ms.Write(buffer, 0, read);
                }
                return ms.ToArray();
            }
        }
    }
}

结果:

这应该可以工作,但不要使用HttpWebRequest,因为它会阻止您的程序,直到下载图像。如果您想使用它,那么您必须在另一个线程中使用它。从这里开始,事情变得非常复杂,因为您无法在另一个线程中使用 Unity 的 API,并且必须使用类似 this 的东西。在另一个线程中调用 Unity 的 API( texture2d.LoadImage(bytes) )。

使用Unity的WWWUnityWebRequest用于此的 API。下面的示例将使用 UnityWebRequest 完成同样的事情。

public Image imageToUpdate;

void Start()
{
    StartCoroutine(downloadImage());
}

IEnumerator downloadImage()
{
    string authorization = authenticate("YourUserName", "YourPass");

    string url = "http://wallpaper-gallery.net/images/hq-images-wallpapers/hq-images-wallpapers-12.jpg";

    UnityWebRequest www = UnityWebRequest.Get(url);
    //www.SetRequestHeader("AUTHORIZATION", authorization);

    DownloadHandler handle = www.downloadHandler;

    //Send Request and wait
    yield return www.Send();

    if (www.isError)
    {

        UnityEngine.Debug.Log("Error while Receiving: " + www.error);
    }
    else
    {
        UnityEngine.Debug.Log("Success");

        //Load Image
        Texture2D texture2d = new Texture2D(8, 8);
        Sprite sprite = null;
        if (texture2d.LoadImage(handle.data))
        {
            sprite = Sprite.Create(texture2d, new Rect(0, 0, texture2d.width, texture2d.height), Vector2.zero);
        }
        if (sprite != null)
        {
            imageToUpdate.sprite = sprite;
        }
    }
}

string authenticate(string username, string password)
{
    string auth = username + ":" + password;
    auth = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(auth));
    auth = "Basic " + auth;
    return auth;
}

关于c# - 使用 HttpWebRequest 下载后 PNG 文件显示为红色问号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43010898/

相关文章:

c# - 使用 Unity 进行 Firebase 电话身份验证

android - 为什么调用外部 java 函数会导致我的应用程序崩溃? (亚马逊 SNS、S3)

c# - 读取内存中的 Excel 电子表格

c# - 如何保护网页

c# - 通过 Web 客户端 post 方法传递两个 JSON 对象 C#

java.lang.NoClassDefFoundError : org/glassfish/jersey/internal/inject/Binder when started Tomcat Server 错误

networking - 在每个客户端上同时启动计时器

c# - WPF 标记扩展如何引发编译错误?

javascript - Moqui AJAX 调用问题

java - 我是否需要编写一个自定义 HttpMessageConverter 来将 List<Long> 作为参数与 RestTemplate 一起传递