2017-03-24 13 views
2

私は次の問題に直面しています:googleドライブからpngファイルをダウンロードしましたが、すべてのバイトが正常に受信されましたが(Texture2DImageにはSpriteと表示されていますが、赤だけに疑問符が表示されます。HttpWebRequestでダウンロードした後、PNGファイルが赤い疑問符で表示される

何か不足していますか?

以下のコード:

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

答えて

2

私はあなたの正確なコードと、このimageで簡単なテストを行なったし、これを行く:

問題は、は、すべての画像のバイトをダウンロードしていないされているということです。これは、HttpWebRequestですべてのイメージバイトをダウンロードする方法ではありません。 whileループでMemoryStreamStream.Readを使用してください。読むべきことが他にない場合、Stream.Read0を返します。適切にこれを行う方法について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を使用していません画像がダウンロードされるまでプログラムそれを使用したい場合は別のThreadで使用する必要があります。 UnityのAPIを別のThreadで使用することができず、別のスレッドでUnityのAPI(texture2d.LoadImage(bytes))を呼び出すには、thisのようなものを使用しなければならないので、これはここから実際に複雑になります。

UnityのWWWまたはUnityWebRequest APIを使用してください。以下の例は、UnityWebRequestと同じ正確なものを実現します。

+2

Omg!ありがとうございました! 私は(間違って)、response.ContentLengthが適切なバイト数を与えると、Readは単にすべてを返すと仮定していました。 私はすでに非同期通信を行っていますが、上記のコードは問題の概要を簡略化しています。今はすべてがうまくいくはずです:)もう一度ありがとう! – MerlinBG

+1

あなたは0になるまで読み続ける必要があります。*「すでに非同期で通信を行っています。上のコードは問題の概要を簡略化しています」*ニース。それは、人々がUnityで間違いを犯すということだけです。あなたが正しい軌道にいるように見えます。ハッピーコーディング! – Programmer

0

あなたはテクスチャが無効になりますエラー応答や中間ページを取得することがあります。受信したデータが本当に有効なPNG画像であるかどうかを確認するには、次の2通りの方法があります。

  1. System.IO.File.WriteAllBytes(path, bytes)で画像ファイルにエクスポートしてください。
  2. the PNG headerで最初の4バイトの比較:

    //0x89, 'P', 'N', 'G' 
    public static readonly byte[] PngHeaderBytes = 
    { 
        0x89, 0x50, 0x4E, 0x47 
    }; 
    

red question mark loading image as texture with WWW参照してください。

+1

はい、私が行ったこの部分とpngヘッダーがあります。判明したように、png全体が配信されたわけではありません。助けてくれてありがとう。 – MerlinBG

関連する問題